Extrai arquivos com extensão de arquivo específica e mantém a estrutura de diretórios?

4

Eu tenho um monte de arquivos .CR2 e .ARW misturados em um diretório estruturado por data (2016 tem as pastas 06 e 07 dentro dele com uma pasta para cada dia nelas. Então um arquivo pode ser localizado em 2016 / 06/03 por exemplo).

Eu quero extrair os arquivos .ARW em uma pasta separada, mantendo a estrutura. Isso é possível?

Ou seja, eu quero ter duas pastas 2016 com a mesma estrutura, mas em uma, deve haver apenas arquivos .ARW e em uma só deve haver arquivos .CR2.

    
por mnordber 25.07.2016 / 21:05

3 respostas

3

Estes comandos rsync devem fazer o que você está procurando

Isso fará o ARW

rsync -arvz --progress --include='*.ARW' --include="*/" --exclude="*" ./source-dir-2016 ./target-ARW-2016

E isso fará o CR2

rsync -arvz --progress --include='*.CR2' --include="*/" --exclude="*" ./source-dir-2016 ./target-CR2-2016

Eu usei este post para uma fonte de informação.

    
por 25.07.2016 / 21:25
3

Vou sugerir uma alternativa usando find exec e cp --parents

find ./ -name *.ARW -exec cp --parents {} /home/user/target-ARW-dir/ \;
find ./ -name *.CR2 -exec cp --parents {} /home/user/target-CR2-dir/ \;

A limitação disso é que o seu diretório de trabalho tem que estar acima da estrutura de arquivos que você deseja copiar.

Uma ideia do que faz:

find localizar arquivos

./ do diretório em que ele aparecerá

-name *.ARW apenas lista arquivos que terminam em .ARW

-exec executa comandos na lista de arquivos retornados

cp --parents copie e mantenha a estrutura de diretórios

{} expande para cada um dos arquivos find relatórios, pense nisso como x in for x in $files

/home/user/target-ARW-dir/ apenas um diretório de exemplo, você deve mudar isso para o que você realmente quer

\; maneira correta de terminar um find -exec para que ele aja como um loop for

    
por 25.07.2016 / 21:38
0

Que tal cp recursivamente 2016 dir para 2016_ARW e rm *.CR2 disso, então rm *.ARW do principal.

por exemplo,

user:~$ ls 2016/06/03/
file_one.ARW file_two.CR2 file_three.CR2 file_four.ARW file_five.ARW
user:~$ cp -R 2016 2016_ARW
user:~$ rm 2016_ARW/06/03/*.CR2
user:~$ rm 2016/06/03/*.ARW
user:~$ ls 2016/06/03/
file_two.CR2 file_three.CR2
user:~$ ls 2016_ARW/06/03/
file_one.ARW file_four.ARW file_five.ARW
    
por 25.07.2016 / 21:39