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