Um script para mover arquivos de subdiretórios para dir pai

5

Estou procurando um script para mover arquivos de subdiretórios para o diretório pai

Minha estrutura de pastas é assim.

  • Dentro de uma pasta A eu tenho muitas pastas chamadas 1,2,3,4,5 ...
  • Todas essas pastas contêm mais 2 pastas chamadas B e C.
  • B e C contêm arquivos que eu quero mover um nível acima, depois excluo as pastas B e C.

Agradeço antecipadamente por qualquer ajuda que você possa me dar com esse script

    
por Misa 06.08.2013 / 13:14

4 respostas

3

Você pode usar:

find test/*/* -type d | xargs -n1  sh -c 'echo mv -b ${0}/* "$( dirname ${0})" ";" rm -rvf ${0} '

Ele apenas imprimirá a saída na tela conforme abaixo:

mv -b test/1/B/file1 test/1/B/file2 test/1/B/file3 test/1 ; rm -rvf test/1/B
mv -b test/1/C/file1 test/1/C/file2 test/1/C/file3 test/1 ; rm -rvf test/1/C
mv -b test/2/B/file1 test/2/B/file2 test/2/B/file3 test/2 ; rm -rvf test/2/B
mv -b test/2/C/file1 test/2/C/file2 test/2/C/file3 test/2 ; rm -rvf test/2/C
mv -b test/3/B/file1 test/3/B/file2 test/3/B/file3 test/3 ; rm -rvf test/3/B
mv -b test/3/C/file1 test/3/C/file2 test/3/C/file3 test/3 ; rm -rvf test/3/C
mv -b test/4/B/file1 test/4/B/file2 test/4/B/file3 test/4 ; rm -rvf test/4/B
mv -b test/4/C/file1 test/4/C/file2 test/4/C/file3 test/4 ; rm -rvf test/4/C
mv -b test/5/B/file1 test/5/B/file2 test/5/B/file3 test/5 ; rm -rvf test/5/B
mv -b test/5/C/file1 test/5/C/file2 test/5/C/file3 test/5 ; rm -rvf test/5/C

Se a saída parece OK, então você pode simplesmente acrescentar | sh no final desse comando, então ele irá executar o comando que é mostrado na saída.

    
por Rahul Patil 06.08.2013 / 15:55
1

Os seguintes comandos farão o trabalho:

cd /path/to/A
find -mindepth 3 -type f -execdir mv {} .. \;
find -mindepth 2 -type d -exec rm -d {} \;

Veja também man find para diferenças entre as ações -exec e -execdir .

    
por Radu Rădeanu 06.08.2013 / 15:55
1

Devido a sua estrutura de diretórios, você não precisa de find para isso - o shell será suficiente:

# the trailing slash below restricts results to directories
for dir in /path/to/A/*/; do
    mv "$dir"/[BC]/* $dir && rmdir "$dir"/[BC]
done
    
por glenn jackman 06.08.2013 / 16:46
0

O segundo conjunto de for loops no script abaixo deve fazer o que você está procurando. Eles estão rotulados ...

# move files from subdirs to the parent directory

O primeiro conjunto cria o tipo de estrutura de arquivos que você descreveu e há algumas listagens de arquivos ( ls ) para mostrar o que está acontecendo.

Execute o script como está dentro de um diretório vazio para verificar se ele faz o que você deseja. Em seguida, recorte o segundo conjunto de loops for e altere para usar os padrões de diretório e nome de arquivo necessários.

A única coisa incomum nesse segundo conjunto é o fechamento do loop for interno entre parênteses ( ... ) . Este é um "bashism" conveniente que executa o que está dentro dele em um subshell e, portanto, o cd afeta apenas o loop for interno. Se você não quiser usá-los, remova-os e adicione um cd .. após o loop for interno.

#!/bin/bash

echo "
Current dir= $(pwd)
"

# populate directories
for d1 in 1 2 3
do
  for d2 in B C
  do
    mkdir -p $d1/$d2
    for f in 1 2
    do
      touch $d1/$d2/file$d2$f   # include $d2 in filename so unique when merged
    done
  done
done

echo "
ORIGINAL FILE STRUCTURE...
"
# show dirs & files recursively
ls -lR *

# move files from subdirs to the parent directory
for d1 in 1 2 3
do (                    # run in subshell so 'cd' does not change outer loop dir
  cd $d1                #   cd into dir so mv is simpler
  for d2 in B C
  do
    mv $d2/* .          #     Move files in B and C up to parent dir
    #                   #     NOTE: Files in B with same name as
    #                   #           files in C will be silently overwritten!
    rmdir $d2           #     Remove the now empty B and C dirs (OPTIONAL)
  done
)
done

echo "

FINAL FILE STRUCTURE...
"
# show dirs & files recursively
ls -lR *

echo "
Current dir= $(pwd)
"
    
por DocSalvager 07.08.2013 / 03:14