Comment sortir d'un shell script si le fichier cible n'existe pas
Donné le script ci-dessous, je voudrais éviter l'exécution du pipeline si un fichier n'existe pas.
Comment puis-je quitter le script tout de suite, si le fichier txt n'est pas trouvé?
ls */*.txt | grep ab1 | awk '{print $1, $1}' | sed "s/\"/\"\"/g" | xargs -L1 mv
Vous voulez probablement
rename
pour cela.OriginalL'auteur amine | 2013-05-30
Vous devez vous connecter pour publier un commentaire.
Vous pouvez vérifier l'existence du fichier avec quelque chose comme:
Pour quitter si il n'est pas, quelque chose comme cela devrait suffire:
La
-f <file>
est seulement un de nombreuses expressions conditionnelles, vous pouvez utiliser. Si vous regardez labash
homme-page sousCONDITIONAL EXPRESSIONS
, vous verrez une multitude d'entre eux.Si (comme indiqué dans une question de mise à jour) vous souhaitez vérifier si un caractère générique des résultats dans des fichiers, vous pouvez simplement prendre de l'expansion, de jeter les erreurs. Si il n'en existe pas, vous vous retrouverez avec une chaîne vide qui peut être détecté avec
-z
:Notez que j'ai utilisé
-1
pour forcer un fichier par ligne, même si Linuxls
n'est que par défaut, si le périphérique de sortie n'est pas un terminal (de mémoire). C'est seulement dans le cas où vous essayez ceci sur une machine qui n'est pas la force d'un par ligne dans ce cas.Gardez cependant à l'esprit que, si vous avez des espaces dans les noms de fichiers, à l'aide de
ls
et puisawk
pour extraire la colonne 1, est de ne pas aller au travail trop bien. Par exemple, le fichierabc ab1.txt
sera le résultat de l'extraction de la seuleabc
peu.À l'aide de
find
avec-print0
, combiné avecxargs
avec-0
est la manière habituelle de traiter correctement les fichiers qui peuvent avoir des caractères "spéciaux". Il existe de nombreuses autres options que vous pouvez donner àfind
pour s'assurer que les fichiers sont traitées, comme-maxdepth
à la limite de comment loin dans l'arborescence du répertoire vous allez, et-name
à filtrer correctement les noms de fichiers.Toutefois, si vous savoir que vous n'aurez jamais ces types de fichiers, il est probablement correct d'utiliser le
ls
solution, assurez-vous juste que vous êtes à l'aise avec ses défauts.pas de probs, a ajouté un additif pour prendre soin de cela.
Le travail parfaitement. Grâce paxdiablo. =)
OriginalL'auteur paxdiablo
Utilisation
test
Un rapide, de court et de moyen de test pour l'existence:
Vous pouvez la chaîne d'elle en faisant:
Auquel cas
something
etsomething-else
ne s'exécutera que si le fichier existe.Par exemple:
De côté: Noter que
[
est un alias pourtest
. La sémantique de[[
sont définis par bash et peut être trouvé sur la page de manuel de bashCependant...
...vous êtes probablement mieux d'utiliser
find
récupérer vos fichiers:Que la sortie de
ls
ne peut pas être analysée de manière fiable. Ce sera également la seule exécution de la commandedo-something-to-filename
si le fichier existe, qui est ce que je pense que vous essayez de faire.{}
sera remplacé par le nom de fichier pour chaque invocation dedo-something-to-filename
.test de commande ne fonctionne pas et que votre meilleur pari est définitivement à l'aide de
find
. Vous pouvez utiliser trouver à l'intérieur de test de tout avoir sur une seule ligne:test -n "$(find ./ -maxdepth 2 -name "*er*.py")" && do-stuff || handle-failure
OriginalL'auteur brice
find ... -exec ...
oufind ... -print0 | xargs -0 ...
est généralement bon, mais vous pouvez le faire directement avec une boule à l'aide de bash estnullglob
option:En fonction du reste de votre script, vous peut ou peut ne pas vouloir re-unset qu'avec
shopt -u nullglob
.OriginalL'auteur Kevin
J'ai essayé et cela a fonctionné pour moi
Remarque que je suis réellement quitter lorsque le fichier n'est pas présent
OriginalL'auteur Kishan B