Qual comando devo usar para mover esses elementos em particular?

1

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?

    
por BusyAnt 28.08.2015 / 12:37

2 respostas

6

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 .
    
por 28.08.2015 / 12:48
1

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)

    
por 28.08.2015 / 17:55