Como deixar o comando 'cp' não disparar um erro quando o arquivo de origem não existe?

42

Estou usando o Mac OS X. Eu estou tentando copiar alguns arquivos com o comando cp para um script de compilação como este.

cp ./src/*/*.h ./aaa

Mas este comando dispara um erro se não houver nenhum arquivo .h no diretório ./src. Como fazer o comando não disparar o erro? (falha silenciosa) O erro faz com que o resultado da compilação falhe, mas eu só quero copiar quando houver apenas algum arquivo de cabeçalho.

    
por Eonil 23.06.2010 / 04:55

5 respostas

56

Se você está falando sobre a mensagem de erro, pode suprimi-la enviando-a ao intervalo de bits:

cp ./src/*/*.h ./aaa 2>/dev/null

Se você quiser suprimir o código de saída e a mensagem de erro:

cp ./src/*/*.h ./aaa 2>/dev/null || :
    
por 23.06.2010 / 06:07
10

Você está procurando algo nos moldes de

if [ -e file ]
 then cp file /somewhere
fi

(Infelizmente, a opção -f não é o droid que você está procurando.)

Se você quiser combinar uma glob, isso não funcionará; use find , por exemplo:

find ./src -name \*.h -exec cp {} ./destination \;
    
por 23.06.2010 / 05:19
8

Antiga pergunta, mas ainda pode ser relevante para outras pessoas.
Se você não precisa usar o cp, você pode tentar com o rsync.
Para copiar todos os arquivos de uma origem para um diretório de destino, execute:

rsync -avzh --ignore-errors /path/to/source /path/to/destination

O Rsync vem com a maioria dos sistemas semelhantes a Unix, como Linux, Mac OS X ou FreeBSD.

    
por 22.08.2015 / 18:22
5

Piping o resultado para true garante que o comando seja sempre bem-sucedido. Eu tentei isso no Linux, mas não em qualquer Mac OS:

cp ./src/*/*.h ./aaa | true
    
por 06.02.2015 / 17:41
1

Você pode forçar o status de erro correto. Com uma função:

$ cpalways () { cp $1 $2 2>/dev/null ; return 0 ; }

Considerando o seguinte:

$ ls foo bar baz
ls: baz: No such file or directory
bar foo

Cópia regular retornará um erro. Ele retornará um status de saída de 1.

$ cp baz bar ; echo $?
cp: baz: No such file or directory
1

Se usarmos a função cpalways () acima, quaisquer erros serão ocultados:

$ cpalways baz bar ; echo $?
0
$ cpalways foo bar ; echo $?
0
$ cpalways baz bar ; echo $?
0
    
por 23.06.2010 / 06:12