Como posso procurar por arquivos em todos os subdiretórios usando o shell e depois copiar esses arquivos?

7

Como posso encontrar apenas os arquivos * .mp3 com um comando recursivo como ls -R *.mp3 em um diretório que contenha vários subdiretórios e, no final, copie esses arquivos em um diretório que eu escolher.

Obrigado pelo seu apoio.

    
por V 3 L 3 N 0 25.08.2012 / 10:42

2 respostas

13

O comando é:

find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \;

Alternativa:

find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/

Exemplo:

alex@MaD-pc:~/test$ ls
1  2  3
alex@MaD-pc:~/test$ ls 1 2 3
1:
1.txt  2.mp3  3.txt

2:
4.txt  5.mp3  6.txt

3:
alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \;
alex@MaD-pc:~/test$ ls 3
2.mp3  5.mp3

Para mais informações:

man find
    
por hytromo 25.08.2012 / 10:44
2

Existe também uma outra maneira de fazer isso, o que eu acho que irá se adequar perfeitamente ao seu propósito. Você pode combinar find com um loop while e nem mesmo usar exec ou xargs . Se, por exemplo, você quisesse copiar seu mp3s de sua pasta de download para sua pasta de músicas, você usaria o seguinte script, que eu usei muitas vezes.

Você pode modificá-lo como quiser, alterando os diretórios que find procura e coloca os arquivos resultantes em; se nenhum diretório for informado, find pesquisará a pasta base inteira. Você também pode alterar cp para mv ou outros comandos. É bem rápido, já que testei com 3945% de arquivos.jpg! Copie-o em um editor de texto, salve-o e torne-o executável executando chmod +x myscript .

#!/bin/bash
# a script to recursively find and copy files to a desired location
find ~/Downloads -type f -iname '*.mp3' -print0 |
while IFS= read -r -d '' f; 
do cp -- "$f" ~/Music ;
done

Neste famoso Bash wiki , é mostrado como é útil combinar o while loop e read comandos para processar a saída do comando find ; e a maneira como eu fiz isso garante que o script não seja quebrado se encontrar nomes de arquivos com espaços ou outros caracteres inesperados ou especiais.

Para mais informações gerais sobre o comando find , digite no terminal man find ou veja o manpages do Ubuntu online . Para uma ótima introdução ao uso da descoberta, consulte este artigo também.

    
por user76204 25.08.2012 / 12:27