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 simplement copier quand il y a seulement un fichier d'en-tête.
:
signifie dans ce contexte.cp
(si cela est souhaité). Le shell intégrétrue
pourrait être utilisé à la place et serait plus lisible.:
- Quel est le but de la commande intégrée GNU Bash `: '(deux points)?cp
ne pas être enPATH
quelque sorte ...)Vous cherchez quelque chose le long des lignes de
(Malheureusement, l'
-f
option n'est pas le droïde que vous recherchez.)Si vous voulez faire correspondre un glob, cela ne fonctionnera pas; utilisez à la
find
place, par exemple:la source
set -e
et que le fichier disparaît entre le[
et lescp
invocations, votre script se bloque).Ancienne question, mais pourrait toujours être pertinente pour les autres.
Si vous n'avez pas besoin d'utiliser cp, vous pouvez essayer avec rsync.
Pour copier tous les fichiers d'une source vers un répertoire de destination, exécutez:
Rsync est fourni avec la plupart des systèmes de type Unix tels que Linux, Mac OS X ou FreeBSD.
la source
--ignore-missing-args
:rsync -av --ignore-missing-args ./src/*/*.h ./aaa
ceci présente l’avantage sur le fait--ignore-errors
que les seules erreurs ignorées sont celles liées aux fichiers source non existants. Avec--ignore-errors
chaque erreur est ignorée, ce qui peut être dangereux. De plus, tenez compte du fait que ce paramètre est assez récent, il pourrait donc ne pas être présent dans les anciennes versions de rsync.Piping le résultat sur true garantit que la commande réussira toujours. J'ai essayé cela sous Linux mais pas sous Mac OS:
la source
|
est toujours exécuté alors que ce||
n'est fait qu'en cas d'erreur. Ettrue
est généralement un binaire alors que le côlon:
est intégré et ne consomme pas de PID.Vous pouvez forcer le statut d'erreur correct. Avec une fonction:
Compte tenu de ce qui suit:
Une copie normale renverra une erreur. Il retournera un statut de sortie de 1.
Si nous utilisons la fonction cpalways () ci-dessus, toutes les erreurs seront masquées:
la source