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ê?
Por que você precisa que ele ignore esse arquivo, em vez de apenas excluí-lo depois de copiá-lo? Já existe no diretório de destino?
Lasse V. Karlsen
1
Sim, um arquivo com o mesmo nome já está morando no diretório de destino.
Joe Cannatti
@ LasseV.Karlsen: Ou você pode querer economizar tempo ao copiá-lo, se for um arquivo grande. Estou interessado nisso, mas excluindo um diretório em vez de um arquivo.
Nikana Reklawyks de
Respostas:
54
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/{}+
Isso acabou sendo o melhor para mim porque parece que o OS X vem sem glob habilitado.
Joe Cannatti
6
@Max \;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.
John Kugelman
149
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:
Você está copiando os arquivos para uma pasta aninhada na pasta da qual está copiando?
Jon
47
Isso precisa shopt -s extglobfuncionar, se tiver sido desativado.
Barry Kelly
5
Parece que o OS X precisa ser usado shopt -s extglobconforme descrito por @BarryKelly. Com isso, funciona perfeitamente.
Kat
Anos no Bash e não sabia sobre !()... 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 .
Brandt
73
O rsync tem sido meu substituto cp / scp por muito tempo:
O primeiro comando não é o que o OP pediu. Se 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.
SnowFrog
2
que tal default.png já existe em destdir? Sua solução não funcionará.
Iman Mohamadi
2
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.
Bem-vindo ao SO. Infelizmente, sua resposta não está correta. O colchete expresssion ( [...]) 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.
Respostas:
Simples, se
src/
contiver apenas arquivos:Se
src/
tiver subdiretórios, isso os omite, mas copia os arquivos dentro deles:Se
src/
tiver subdiretórios, isso não ocorrerá novamente:fonte
\;
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:
Se estiver copiando para uma pasta aninhada na pasta atual (chamada de exemplo no caso abaixo), você também precisa omitir esse diretório:
fonte
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:
fonte
-r
argumento se estiver sincronizando diretóriosEu apenas faria:
a menos que os arquivos sejam grandes. Caso contrário, use por exemplo
fonte
Default.png
existir nos dois diretórios, ele substituirá o de dentrodestdir
pelo de esrcdir
, em seguida, excluirá o copiadoDefault.png
. Em vez disso, o OP deseja manter oDefault.png
que já existe emdestdir
.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.
fonte
fonte
fonte
use o parâmetro de expansão do shell com regex
Tudo será copiado, exceto o not_to_copy_file
- se algo está errado com isso. por favor especifique !
fonte
[...]
) 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
.