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.


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 {} \;

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'

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.


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.


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

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.


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*

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.