Move todos os arquivos com uma certa extensão de vários subdiretórios para um diretório

27

Eu tenho um monte de arquivos .zip em vários diretórios:

Fol1/Fol2
Fol3
Fol4/Fol5

Como faço para movê-los todos para uma pasta base comum?

    
por InquilineKea 10.03.2013 / 22:28

6 respostas

39

Vá para o diretório de nível superior da árvore que contém os arquivos zip ( cd … ) e, em seguida, execute

mv **/*.zip /path/to/single/target/directory

Isso funciona fora da caixa em zsh. Se seu shell é bash, você precisará executar shopt -s globstar primeiro (você pode e deve colocar este comando em seu ~/.bashrc ). Se seu shell for ksh, você precisará executar set -o globstar primeiro (coloque-o em ~/.kshrc ).

Como alternativa, use find , que funciona em qualquer lugar, sem preparação especial, mas é mais complicado:

find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;

Se você quiser remover diretórios vazios depois, em zsh:

rmdir **/*(/^Fod)

No bash ou ksh:

rmdir **/*/

e repita enquanto houver diretórios vazios para remover. Alternativamente, em qualquer casca

find . -depth -type d -empty -exec rmdir {} \;
    
por 10.03.2013 / 23:25
10

Se você quiser mover apenas os arquivos .zip , poderá fazer algo como

mkdir ./zipfiles
find . -name "*.zip" -exec mv "{}" ./zipfiles \;
    
por 10.03.2013 / 22:37
2

Se você estiver usando bash versão 4 ou superior ou zsh , também poderá usar globalização recursiva:

mv **/*.zip /path/to/move/zip/files/to

Isso moverá APENAS os arquivos, e não seus caminhos relativos, para que ocorram colisões.

    
por 10.03.2013 / 23:26
0

Como um hack bash, você pode usar o poder de tar :

(cd origin/;find . -exec file --mime-type "{}" \;|grep "application/zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr origin/

Isso tem a vantagem de não depender de extensões de arquivos, pois usa o comando file para escolher os arquivos a serem movidos e preserva a estrutura de diretórios, mas não funciona com caminhos que contenham espaços.

O rm final está lá apenas para remover os arquivos originais (porque @InquilineKea disse que ele não se importa com a pasta original no comentário).

Claro que isso é particularmente adequado se as pastas origem / destino / estão em discos diferentes. Caso contrário, as outras soluções propostas são mais eficientes (mesmo que dependam de convenções de nomenclatura, em vez do conteúdo de file ).

    
por 13.03.2013 / 18:21
0

Supondo que você tenha as versões GNU de find e mv, o seguinte será mais eficiente do que as respostas baseadas em localização existentes:

find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +

Usar + no final do find -exec significa que uma lista de arquivos será passada para o comando mv, em vez de executar um comando mv por arquivo encontrado. No entanto, uma limitação disso é que você só pode colocar o '{}' no final do comando, o que requer o uso da opção mv --target-directory, e até onde eu sei que é um GNU-ism.

    
por 30.03.2016 / 23:01
0

Este é seguro ao mover dados e sem erros que suportam a maioria das versões independentes da distribuição. Este comando verificará os subdiretórios e, em seguida, moverá ou copiará para o novo diretório de destino.

find . -name *.flac -exec mv '{}' "./flac/" ";"
  • Execute este comando no diretório principal que contém subdiretórios com os arquivos que você deseja mover.
  • Onde " .flac" você pode alterá-lo para algo como " .zip" no seu caso. Ou "* .doc", qualquer extensão funciona.
  • e "mv" é o comando para mover arquivos, ou você pode usar "cp" para copiar dados em vez de mover.
  • "./flac/" é o diretório de destino para o qual desejo mover todos os arquivos FLAC. você também pode dar um caminho completo como "/ home / myid / flac /"

Exemplo completo. (neste caso, existem muitos subdiretórios com o nome do artista de música em / home / myid / Music / e, em seguida, os arquivos FLAC estão em todo nível de subdiretórios diferentes. Desde que eu não preciso de pastas de artista, mas quero ter todos os arquivos FLAC em um diretório em / home / myid / Music / flac /

  1. cd / home / myid / Music
  2. mkdir flac
  3. encontre. -name * .flac -exec mv '{}' "./flac/" ";"
  4. cd flac
  5. ls

Em seguida, ele exibirá todos os arquivos FLAC.

    
por 04.10.2018 / 03:08