116 votes

Comment faire pour que la commande 'cp' ne génère pas d'erreur lorsque le fichier source n'existe pas ?

J'utilise Mac OS X. J'essaie de copier quelques fichiers avec la commande cp pour un build script comme ceci.

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 y a seulement quelques fichiers d'en-tête.

140voto

jason saldo Points 5036

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

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

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

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

26voto

Brad Ackerman Points 2111

Vous cherchez quelque chose du genre

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

(Malheureusement, le -f 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 \;

16voto

Vivek Points 101

Transférer le résultat à true garantit que la commande réussira toujours. J'ai essayé cela sous Linux mais pas sous Mac OS :

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

13voto

mre Points 291

Vieille question, mais qui pourrait encore être pertinente pour d'autres.
Si vous ne le faites pas besoin de pour utiliser cp, vous pouvez essayer avec rsync.
Pour copier tous les fichiers d'un répertoire 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.

2voto

Stefan Lasiewski Points 22459

Vous pourriez forcer le statut d'erreur correct. Avec une fonction :

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

Compte tenu de ce qui suit :

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

La copie normale renverra une erreur. Elle renvoie un statut de sortie de 1.

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

Si nous utilisons la fonction cpalways() ci-dessus, toute erreur sera masquée :

$ cpalways baz bar ; echo $?
0
$ cpalways foo bar ; echo $?
0
$ cpalways baz bar ; echo $?
0

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X