Portanto, você pode usar o *
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
arquivo?
Portanto, você pode usar o *
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
arquivo?
Respostas:
Em bash
você pode usar extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
onde !(b*)
excluir todos os b*
arquivos.
Mais tarde, você pode desativar extglob
com
$ shopt -u extglob
find
é a única maneira de tcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
O Rsync lida com isso muito bem.
Exemplo de copiar tudo: rsync -aP /folder1/* /folder/2
Exemplo de cópia de todos com exclusão: rsync -aP --exclude=x /folder1/* /folder2/
O -aP
interruptor:
a: Semelhante a cp -a
, recursivo etc. P: Mostra o progresso, um bom recurso do rsync.
-rP
vez de, -aP
se quiser recursar. -a
é para arquivamento. Não tenho certeza se isso mudou ou se é apenas diferente no MacOS.
rsync
tem a opção de torná-lo recursivo. Exemplo: rsync --recursive -P --exclude=x /folder1/* /folder2/
. (Testado apenas no Ubuntu)
Isso não é um recurso cp
, é um recurso do seu shell (ele expande *
todos os arquivos que não são pontos), então a resposta depende de qual shell você está usando. Por exemplo, zsh
suporta esta sintaxe:
$ cp ^x /path/to/destination
Onde ^x
significa "todos os arquivos, exceto x
"
Você também pode combinar padrões de seleção e desmarcação, por exemplo, para copiar todos os arquivos wav, exceto aqueles que contêm xyz, você pode usar:
cp *.wav~*xyz*
bash
?
Também pode ser feito no shell bourne antigo (portátil / compatível) de várias maneiras, com ferramentas padrão de maneira muito menos elegante do que usar globbing avançado do shell 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 bash
ferramentas GNU são ótimas 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 de 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).
cp -R * subdir/
cp
(não de bash
/ sh
), " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
". A cópia é concluída corretamente, no entanto. Infelizmente, sua variante quebra com qualquer nome de arquivo que contenha um espaço ou pontuação sensível a shell. Veja unix.stackexchange.com/q/128985/135943
extglob
é a melhor maneira até agora, eu acho.
Outra maneira é usar
cp $(ls --ignore=x) subdir/
$
etc.) Nunca analise a saída de ls
. unix.stackexchange.com/q/128985/135943