Je suis dans un script bash et je veux obtenir la liste de tous les fichiers (disons tous les fichiers jar). J'exécute la commande ls -1 lib/*.jar
et j'obtiens la sortie:
lib/mylib_1.jar
lib/mylib_2.jar
...
Existe-t-il une option pour avoir la sortie suivante:
mylib_1.jar
mylib_2.jar
...
Faire cd lib
avant n'est pas une option car je suis dans une boucle et je dois être dans le dossier parent pour les actions que je veux faire à l'intérieur de la boucle.
J'ai essayé de trouver des informations en tapant man ls
mais je n'ai trouvé aucune solution.
Une solution avec une autre commande serait bonne tant que je peux la diriger vers ma ls
commande ou me suffire à elle-même.
Réponses:
Au lieu d' analyser ls, vous devriez utiliser à la
find
place. Ensuite, vous pouvez également exécuterbasename
sur chaque fichier pour supprimer les répertoires principaux:la source
-maxdepth
option.Avec GNU,
find
il n'est pas nécessaire de courirbasename
pour chaque fichier, ce sera beaucoup plus rapide (surtout s'il y a beaucoup de fichiers):la source
Que diriez-vous
(cd lib && echo *.jar)
, en supposant que vous n'avez pas d'espaces ou de caractères spéciaux dans les noms de fichiers. Le script parent ne change jamais de répertoire.la source
printf '%s\n' *.jar
pour obtenir chaque fichier sur une ligne différente.printf '%s\0' *.jar
pour éliminer les problèmes d'espace (bien que ce ne soit pas le Q).Comme Josh Jolly l'a dit dans sa réponse, vous ne devriez jamais analyser
ls
, utilisez plutôt l'approche dans sa réponse. Pourtant, voici uneawk
solution pour supprimer les chemins d'accès des noms de fichiers, ne l'utilisez pas avec ls:Le
-F'/'
définit le séparateur de champ,/
ce qui signifie que le dernier champ$NF
, sera le nom du fichier.la source
find
est probablement la voie à suivre, mais si vous vraiment, vraiment faire (vous n'avez pas) voulez dépouillerlib/
dels -1
, vous pouvez utilisersed
:la source
Vous pouvez le faire en utilisant xargs avec un paramètre --max-args (ou l'alias plus court -n):
ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename
Notez que nous utilisons
--quoting-style=c
pour nous assurer que les espaces dans les noms de fichiers ne bousillent pas les xargs.la source
Une autre façon de résoudre votre requête consiste à répertorier tous les fichiers à l'aide de
ls -R
. Combinez la sortie de la commande ls avec grep pour répertorier uniquement les fichiers .jar. Vous pouvez utiliser la commande suivante pour faire de même pour votre requête:la source
mylib_2.jar
et filtrerait les fichiers commelist-of-jars.txt
.find development -name '*.jar' | wc -l
->70
.ls -R development | grep jar| grep -v jar*
-> pas de sortie du tout.