Como mover arquivos de subdiretórios com uma determinada extensão recursivamente para uma pasta de destino? [duplicado]

8

Eu quero mover todos os arquivos *.txt de todos os subdiretórios localizados em um determinado diretório para um diretório de destino.

Ao fazer isso como abaixo, ele move TODO arquivo - como posso reduzi-lo para todos os arquivos *.txt apenas?

find -type f -print0|xargs -0r mv -it "/path to my folder/destination-directory"
    
por Middi 27.02.2017 / 16:51

4 respostas

10

Use um padrão glob com a opção -name de find para indicar o padrão desejado, *.txt no seu caso:

find . -type f -name '*.txt' -exec mv -t /destination {} +

Claro, substitua /destination pelo diretório de destino real.

Notas:

  • Você não precisa gerar xargs e um canal anônimo, use a lógica mv no predicado -exec de find

  • find ... -exec lida com todos os tipos possíveis de nomes de arquivos e ARG_MAX

  • O GNU mv (padrão no Ubuntu) tem -t para ter um diretório de destino, para que você possa aproveitar o argumento + de -exec para enviar todos os arquivos em execução única de mv (ou pelo menos execuções mínimas se ARG_MAX for acionado no processo)

por heemayl 27.02.2017 / 16:56
6

Adicione um -name test

find -type f -name "*.txt" -print0 |...

Não se esqueça de citar o glob para evitar expansões de shell.

Para pesquisa sem distinção entre maiúsculas e minúsculas, use -iname em vez de -name

    
por Zanna 27.02.2017 / 16:56
3
find /folder/ -type f -name "*.txt" -exec mv {} /other/folder/ \;

Eu testei isso, funciona bem.

    
por Seth 27.02.2017 / 16:59
2

Usando seu comando original:

find . -type f -name "*.txt" -print0|xargs -0r mv -it /path/to/destination

Informação:

  1. . : pesquisa na localização atual

  2. "*.txt" : arquivos que possuem uma extensão .txt em seus nomes

por George Udosen 27.02.2017 / 17:06