Copiando arquivos com várias extensões


22

Gostaria de copiar arquivos com várias extensões para um único diretório de destino.

Por exemplo, eu posso usar o seguinte comando para copiar todos os arquivos .txt no diretório de trabalho para um diretório chamado destination:

cp -v *.txt destination/

E posso usar o seguinte para copiar todos os diretórios .png no diretório de trabalho para destination:

cp -v *.png destination/

Mas consome tempo digitando-os como comandos separados (mesmo com o uso do histórico de comandos). Então, há alguma maneira que eu posso dizer cppara copiar arquivos ou com o padrão *.txt ou o padrão *.pngde destination? Idealmente, eu gostaria de poder especificar mais de dois padrões - como instruções cppara copiar todos *.txt ou *.png ou *.jpg arquivos para destination, por exemplo.

Tenho certeza de que tudo isso é possível usando um script de shell - estou usando bash, por exemplo -, mas existe alguma maneira de realizá-lo de maneira mais simples, apenas no console? De alguma forma, eu poderia usar a expansão de chaves para fazer isso?

Eu sei que é possível copiar todos os arquivos no diretório de trabalho, exceto aqueles que correspondem a determinados padrões especificados , mas como meu diretório de trabalho contém muito mais extensões de arquivo que eu não quero copiar do que aquelas que eu faço , isso seria um problema.

Você tem alguma opinião sobre isso?


10
cp -v *.txt *.png destination/?
iruvar 24/09/14

Respostas:


55

A expansão da cinta fará o trabalho. man bashe procure Brace Expansion.

cp *.{txt,jpg,png} destination/

EDITAR:

De acordo com a solicitação do OP, o comando acima estava ausente na opção detalhada:

cp -v *.{txt,jpg,png} destination/

2
Posso fazer isso no Windows?
sergiol 18/08/16

Se eu existir cp data/images/*.{jpg,jpeg,png,mp4} destination/e um mp4arquivo não existir, eu recebo um No such file or directoryerro que quebra o script. Posso fazer com que as múltiplas extensões manejem graciosamente quaisquer formatos ausentes?
BradGreens 25/02

1
@BradGreens Você realmente deve postar uma nova pergunta em vez de perguntar aqui nos comentários. Sua pergunta pode até ter uma resposta. A publicação de uma nova pergunta não só lhe dará uma resposta, mas também pode ser pesquisada por outras pessoas que precisam da mesma ajuda.
Timothy Martin

0
for filename in /Photos/directory/* ; do
    filenameWithoutPath="${filename##*/}"
    first_num="${filenameWithoutPath%%.*}"
    last_num="${filenameWithoutPath##*.}"
    cp $filename /Photos/directory/$first_num-$last_num.jpg
done

Isso está funcionando!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.