Como posso mover arquivos por tipo recursivamente de um diretório e seus subdiretórios para outro diretório?

30

Qual seria uma boa maneira de mover um tipo de arquivo de um diretório e de todos os seus subdiretórios?

Como "mova todos * .ogg em / thisdir recursivamente para / somedir". Eu tentei algumas coisas; meu melhor esforço foi (ainda não tão bom):

find /thisdir -type f -name '*.ogg' -exec mv /somedir {} \;

Ele retornou em cada linha antes de cada nome de arquivo,

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'
Steve Burdine
fonte

Respostas:

23

você pode usar o find com xargs para isso

find /thisdir -type f -name "*.ogg" -print0 | xargs -0 -Imysongs mv -i mysongs /somedir

O comando -I no comando acima informa ao xargs qual sequência de substituição você deseja usar (caso contrário, adiciona os argumentos ao final do comando).

OU
No seu comando, apenas tente mover '{}' após o mvcomando.

find /thisdir -type f -name '*.ogg' -exec mv -i {} /somedir \;

Hemant
fonte
11
por favor, não esqueça de fazer backup antes de tentar os comandos acima :-).
Hemant
2
Btw, para o primeiro -print0 para localizar e -0 para xargs deve ser usado da maneira possível, para evitar espaços em branco nos problemas de nome de arquivo.
maxschlepzig 03/09/10
@maxschlepzig: bom ponto. Eu vou editar.
Hemant
2
Eu sugiro usar mv -iaqui, assim você não corre o risco de sobrescrever arquivos se algo inesperado acontecer.
Gilles 'SO- stop be evil'
2
com o mv do gnu core utils, você pode usar mv -t <targetdir>e + em vez de \;
10
find /thisdir -type f -name "*.ogg" -exec mv {} /somedir \;

Você meio que trocou os argumentos para mv

Coding District
fonte
9

No zsh ou no bash 4, para reunir todos os *.oggarquivos em /somedir:

mv /thisdir/**/*.ogg /somedir

Se você deseja reproduzir a hierarquia de diretórios: (aviso, digitado diretamente no navegador)

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir
Gilles 'SO- parar de ser mau'
fonte
além do bash em conveniente
Mark