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