web-dev-qa-db-fra.com

Comment laisser la commande 'cp' ne pas déclencher une erreur lorsque le fichier source n'existe pas?

J'utilise Mac OS X. J'essaie de copier certains fichiers avec la commande cp pour un script de construction comme celui-ci.

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

Mais cette commande déclenche une erreur s'il n'y a pas de fichier .h dans le répertoire ./src. Comment faire pour que la commande ne déclenche pas l'erreur? (échec silencieux) L'erreur fait échouer le résultat de la construction, mais je veux juste copier quand il n'y a que des fichiers d'en-tête.

64
Eonil

Si vous parlez du message d'erreur, vous pouvez le supprimer en l'envoyant au compartiment de bits:

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

Si vous souhaitez supprimer le code de sortie et le message d'erreur:

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

Vous cherchez quelque chose dans le sens de

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

(Malheureusement, le -f l'option n'est pas le droïde que vous recherchez.)

Si vous voulez faire correspondre un glob, cela ne fonctionnera pas; utilisez find à la place, par exemple:

find ./src -name \*.h -exec cp {} ./destination \;
14
Brad Ackerman

Vieille question, mais qui pourrait être pertinente pour d'autres.
Si vous n'avez pas besoin pour utiliser cp, vous pouvez essayer avec rsync.
Pour copier tous les fichiers d'une source vers un répertoire de destination, exécutez:

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

Rsync est livré avec la plupart des systèmes de type Unix tels que Linux, Mac OS X ou FreeBSD.

9
mre

Le fait de rediriger le résultat vers true garantit que la commande réussira toujours. J'ai essayé ceci sur Linux mais pas sur aucun Mac OS:

cp ./src/*/*.h ./aaa | true
7
Vivek

Vous pouvez forcer l'état d'erreur correct. Avec une fonction:

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

Compte tenu des éléments suivants:

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

Une copie régulière renverra une erreur. Il renverra un état de sortie de 1.

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

Si nous utilisons la fonction cpalways () ci-dessus, toutes les erreurs seront cachées:

$ cpalways baz bar ; echo $?
0
$ cpalways foo bar ; echo $?
0
$ cpalways baz bar ; echo $?
0
2
Stefan Lasiewski