Como copiar alguns arquivos, mas não todos?

44

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?

    
por Chad Harrison 26.06.2012 / 21:41

6 respostas

38

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
    
por 26.06.2012 / 21:54
42

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.

    
por 26.06.2012 / 21:50
11

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*
    
por 26.06.2012 / 21:54
4

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.

    
por 27.06.2012 / 10:12
1

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).

    
por 29.10.2015 / 00:44
-1

extglob é a melhor maneira até agora, eu acho.

Outra maneira é usar cp $(ls --ignore=x) subdir/

    
por 04.12.2015 / 06:36