Est-il possible de supprimer le préfixe de dossier d'une commande `ls`

12

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/*.jaret 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 libavant 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 lsmais je n'ai trouvé aucune solution.

Une solution avec une autre commande serait bonne tant que je peux la diriger vers ma lscommande ou me suffire à elle-même.

рüффп
la source
Que faites-vous avec les noms de ces fichiers? Les listez-vous simplement sur le terminal, ou les passez-vous à un autre programme ou script (individuellement ou sous forme de liste)? La façon correcte de gérer cela dépend de la façon dont les noms de fichiers sont utilisés.
Kusalananda
L'idée était de faire des statistiques sur les bibliothèques tierces sur un projet Java multi-module. Je voulais juste la liste et faire une sorte et uniq après
рüффп

Réponses:

19

Au lieu d' analyser ls, vous devriez utiliser à la findplace. Ensuite, vous pouvez également exécuter basenamesur chaque fichier pour supprimer les répertoires principaux:

find lib/ -name '*.jar' -exec basename {} \;
Josh Jolly
la source
Ok, cette voie est parfaite pour moi aussi.
2014 à 13h46
3
Voir également l' -maxdepthoption.
13

Avec GNU, findil n'est pas nécessaire de courir basenamepour chaque fichier, ce sera beaucoup plus rapide (surtout s'il y a beaucoup de fichiers):

find lib -name '*.jar' -printf '%P\n'
Graeme
la source
11

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.

doneal24
la source
Les espaces ne seront pas non plus un problème.
terdon
C'est une bonne idée et ce sera probablement l'option la plus rapide. Je ferais cependant printf '%s\n' *.jarpour obtenir chaque fichier sur une ligne différente.
Graeme
Ou même printf '%s\0' *.jarpour éliminer les problèmes d'espace (bien que ce ne soit pas le Q).
Graeme
5

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 une awksolution pour supprimer les chemins d'accès des noms de fichiers, ne l'utilisez pas avec ls:

find . | awk -F'/' '{print $NF}'

Le -F'/'définit le séparateur de champ, /ce qui signifie que le dernier champ $NF, sera le nom du fichier.

terdon
la source
1

findest probablement la voie à suivre, mais si vous vraiment, vraiment faire (vous n'avez pas) voulez dépouiller lib/de ls -1, vous pouvez utiliser sed:

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

la source
0

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=cpour nous assurer que les espaces dans les noms de fichiers ne bousillent pas les xargs.

yoni
la source
Je ne l'ai pas remarqué. Je vous remercie! Trouvé ce joyau sur un autre échange de pile. Vous pouvez introduire des guillemets aux résultats ls avec --quoting-style = c. Ainsi, la commande complète résultante serait: `ls --quoting-style = c -1 lib / *. Jar | xargs --max-args 1 basename`
yoni
-1

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:

ls -R lib | grep jar| grep -v jar*
joshi.mohit86
la source
Cela échouerait gravement s'il y avait un sous-répertoire qui contient également des fichiers jar, ou un fichier nommé par exemple "list-of-jars.txt".
Jules
grep -v jar * filtrerait les résultats avec un fichier nommé comme votre exemple cité.
joshi.mohit86
vrai. il filtrerait également tous les fichiers prévus. Maintenant, je le regarde à nouveau, je ne vois aucune circonstance où la commande que vous proposez produirait réellement une sortie ...
Jules
Non, il afficherait les fichiers comme mylib_2.jaret filtrerait les fichiers comme list-of-jars.txt.
joshi.mohit86
Non, non. Je viens de l'essayer. find development -name '*.jar' | wc -l-> 70. ls -R development | grep jar| grep -v jar*-> pas de sortie du tout.
Jules