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 extglob
funcionar, se tiver sido desativado.
shopt -s extglob
conforme 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
-r
argumento 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.png
existir nos dois diretórios, ele substituirá o de dentro destdir
pelo de e srcdir
, em seguida, excluirá o copiado Default.png
. Em vez disso, o OP deseja manter o Default.png
que 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
.