O glob *
pode ser usado para combinar não apenas arquivos simples, mas também diretórios, então o comando que você está procurando é
mv ./*/*.avi .
Aqui está minha situação inicial:
Em uma pasta nomeada por exemplo Father
, são armazenados alguns arquivos da seguinte maneira: Father
contém 24 pastas filho (vamos chamá-las Child1
, Child2
, ...) e cada uma delas eles tem 2 arquivos, file1.avi
e file1.nfo
para o primeiro filho, file2.avi
e file2.nfo
para o segundo, etc.
O que eu gostaria de fazer é ter todos os arquivos .avi
na pasta Father
. Eu não me importo com os outros arquivos que estão sendo perdidos.
Até agora, o melhor que eu já passei foi com um cp -R ./*.avi .
, mas ele não extraiu os arquivos da pasta e foi, além disso, muito demorado para processar.
Como devo escrever?
Você pode usar a opção find
do comando -exec
:
cd Father
find Child1 Child2 ... -name '*.avi' -exec mv -n {} . +
O comando é dividido da seguinte forma:
find Child1 Child2 ...
encontrará todos os arquivos e diretórios em Child1, Child2, etc. A ação padrão é imprimir seus nomes -name '*.avi'
limitará o resultado a arquivos (ou diretórios) que correspondam ao padrão de nome "* .avi" -exec mv {} . +
significa que find
executará um comando em vez de imprimir os resultados correspondentes; o {}
indica onde no comando find
deve colocar nos nomes de arquivos encontrados, e o +
indica o fim do comando para executar e também sinaliza que ao invés de executar o comando uma vez por nome de arquivo, ele deve tentar colocar tantos nomes de arquivos quanto possível. Por exemplo, pode executar mv -n Child1/as.avi Child1/many.avi Child1/matching.avi Child1/filenames.avi Child1/as.avi Child1/possible.avi .
Se você quiser ver o que tal comando pode fazer, você sempre pode escrever -exec echo mv
em vez de -exec mv
Observação 1: O -name '*.avi'
usa aspas simples, para que o texto *.avi
seja passado ao protocolo literal find
, em vez de potencialmente expandido pelo shell em nomes de arquivos antes de ser obtido para o comando find
.
Observação 2: se você tiver vários nomes de arquivos, em diretórios diferentes, mas com o mesmo nome de arquivo, o comando mv
moverá todos esses arquivos para o mesmo diretório e os arquivos com o mesmo nome irá sobrescrever um ao outro. Você pode evitar isso usando o comando mv -n
(sem modo clobber)
Tags command-line cp mv