Eu gostaria de copiar todos os arquivos de um diretório, exceto um chamado Default.png. Parece que existem várias maneiras de fazer isso. O que parece mais eficaz para você?
Eu gostaria de copiar todos os arquivos de um diretório, exceto um chamado Default.png. Parece que existem várias maneiras de fazer isso. O que parece mais eficaz para você?
Respostas:
Simples, se src/contiver apenas arquivos:
find src/ ! -name Default.png -exec cp -t dest/ {} +
Se src/tiver subdiretórios, isso os omite, mas copia os arquivos dentro deles:
find src/ -type f ! -name Default.png -exec cp -t dest/ {} +
Se src/tiver subdiretórios, isso não ocorrerá novamente:
find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +
\;executa o comando uma vez por arquivo. +executa o comando uma vez e passa todos os nomes de arquivo para ele de uma vez (sujeito ao limite de comprimento da linha de comando). +é um pouco mais eficiente em geral.
Deve ser o seguinte:
cp -r !(Default.png) /dest
Se estiver copiando para uma pasta aninhada na pasta atual (chamada de exemplo no caso abaixo), você também precisa omitir esse diretório:
cp -r !(Default.png|example) /example
shopt -s extglobfuncionar, se tiver sido desativado.
shopt -s extglobconforme descrito por @BarryKelly. Com isso, funciona perfeitamente.
!()... Linda! Para aqueles que --como eu-- sentem que é hora de estudar / revisar o bash , aqui estão os links relevantes relacionados a esta pergunta / resposta: shopt / extglob e o padrão .
O rsync tem sido meu substituto cp / scp por muito tempo:
rsync -av from/ to/ --exclude=Default.png
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
-rargumento se estiver sincronizando diretórios
Eu apenas faria:
cp srcdir/* destdir/ ; rm destdir/Default.png
a menos que os arquivos sejam grandes. Caso contrário, use por exemplo
find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/
Default.pngexistir nos dois diretórios, ele substituirá o de dentro destdirpelo de e srcdir, em seguida, excluirá o copiado Default.png. Em vez disso, o OP deseja manter o Default.pngque já existe em destdir.
Isso funciona muito bem para copiar tudo, exceto módulos de nó :) divirta-se e, graças às respostas acima, acabei de adicionar a ele. Rsync é melhor na minha opinião do que CP, pois você pode ver a barra de progresso sem pedir por isso.
rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules
cp `ls | grep -v Default.png` destdir
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude
use o parâmetro de expansão do shell com regex
cp /<path>/[^not_to_copy_file]* .
Tudo será copiado, exceto o not_to_copy_file
- se algo está errado com isso. por favor especifique !
[...]) contém um conjunto de caracteres para coincidir, enquanto um líder ^causará uma correspondência do complemento dos caracteres listados. No exemplo a seguir, nem arquivo será listada: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*porque todos os nomes que começam com qualquer um dos seguintes caracteres serão excluídos: _cefilnopty.