Em bash
, você pode usar extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
onde !(b*)
exclui todos os arquivos b*
.
Mais tarde, você pode desativar extglob
com
$ shopt -u extglob
Portanto, você pode usar *
como curinga para todos os arquivos ao usar cp
no contexto de um diretório. Existe uma maneira de copiar todos os arquivos, exceto o x
file?
O Rsync lida bem com isso.
Copiar todos os exemplos: rsync -aP /folder1/* /folder/2
Exemplo copie todos com exclusão: rsync -aP --exclude=x /folder1/* /folder2/
A opção -aP
:
a: semelhante a cp -a
, recursivo, etc.
P: Mostra o progresso, um ótimo recurso do rsync.
Este não é um recurso do cp
, é um recurso do seu shell (ele expande o *
para todos os arquivos que não são dot), então a resposta depende do shell que você está usando. Por exemplo, zsh
suporta esta sintaxe:
$ cp ^x /path/to/destination
Em que ^x
significa "todos os arquivos, exceto x
"
Você também pode combinar padrões de seleção e de seleção, por exemplo Para copiar todos os arquivos WAV, exceto aqueles que contenham xyz, você pode usar:
cp *.wav~*xyz*
Também pode ser feito em bourne shell simples (portátil / compatível) de várias maneiras com ferramentas padrão de maneiras menos elegantes do que usar shell globbing avançado ou comandos com opções de exclusão incorporadas.
Se não houver muitos arquivos (e não com nomes, incluindo espaços e / ou quebras de linha), isso pode ser uma maneira:
cp 'ls | egrep -v '^excludename$'' destdir/.
Claro, as ferramentas bash
e GNU são excelentes e poderosas, mas nem sempre estão disponíveis. Se você pretende colocá-lo em um script portátil, eu recomendaria find
como no comentário do Rush.
Se você deseja copiar tudo em uma pasta (incluindo subpastas) para um subdiretório específico:
cp -R $(ls | grep -v '^subdir$') subdir/
Funciona com sh, bash, zsh (pelo menos).
extglob
é a melhor maneira até agora, eu acho.
Outra maneira é usar
cp $(ls --ignore=x) subdir/