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 || :
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.
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 \;
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.
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
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