Ist es möglich, das Ordnerpräfix von einem ls-Befehl zu entfernen?


12

Ich bin in einem Bash-Skript und möchte die Liste aller Dateien erhalten (sagen wir alle JAR-Dateien). Ich führe den Befehl aus ls -1 lib/*.jarund erhalte die Ausgabe:

lib/mylib_1.jar
lib/mylib_2.jar
...

Gibt es eine Option, um die folgende Ausgabe zu haben:

mylib_1.jar
mylib_2.jar
...

Vorheriges cd libErstellen ist keine Option, da ich mich in einer Schleife befinde und für die Aktionen, die ich in der Schleife ausführen möchte, im übergeordneten Ordner sein muss.

Ich habe versucht, Informationen durch Tippen zu finden, man lsaber ich habe keine Lösung gefunden.

Eine Lösung mit einem anderen Kommando wäre gut, solange ich es an mein lsKommando weiterleiten kann oder autark.


Was machst du mit den Namen dieser Dateien? Führen Sie sie nur dem Terminal zu oder übergeben Sie sie einem anderen Programm oder Skript (einzeln oder als Liste)? Die richtige Vorgehensweise hängt davon ab, wie die Dateinamen verwendet werden.
Kusalananda

Die Idee war, Statistiken über Drittanbieter-Bibliotheken in einem Java-Projekt mit mehreren Modulen zu erstellen. Ich wollte nur die Liste und mache eine Art und einzigartig nach
рüффп

Antworten:


19

Anstatt ls zu analysieren , sollten Sie findstattdessen verwenden. Dann können Sie auch basenamefür jede Datei ausführen , um die führenden Verzeichnisse zu entfernen:

find lib/ -name '*.jar' -exec basename {} \;

Ok, dieser Weg ist auch perfekt für mich.
рüффп

3
Siehe auch die -maxdepthOption.

13

Mit GNU findmuss nicht basenamefür jede einzelne Datei ausgeführt werden, dies ist viel schneller (besonders wenn es viele Dateien gibt):

find lib -name '*.jar' -printf '%P\n'

11

Wie wäre es (cd lib && echo *.jar), vorausgesetzt , dass Sie nicht über Leerzeichen oder Sonderzeichen in den Dateinamen. Das übergeordnete Skript ändert niemals das Verzeichnis.


Leerzeichen werden auch kein Problem sein.
Terdon

Dies ist eine gute Idee und wird wahrscheinlich die schnellste Option sein. Ich würde tun printf '%s\n' *.jar, um jede Datei in einer anderen Zeile zu bekommen.
Graeme

Oder auch printf '%s\0' *.jar, um Leerzeichenprobleme zu beseitigen (obwohl dies nicht das Q ist).
Graeme

5

Wie Josh Jolly in seiner Antwort sagte, sollten Sie niemals analysieren ls, sondern den Ansatz in seiner Antwort verwenden. Hier ist eine awkLösung zum Entfernen von Pfaden aus Dateinamen. Verwenden Sie sie nur nicht mit ls:

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

Das -F'/'setzt das Feldtrennzeichen, /was bedeutet, dass das letzte Feld $NFder Dateiname ist.


1

findder Weg ist wahrscheinlich zu gehen, aber wenn Sie wirklich, wirklich tun (Sie dies nicht tun) wollen abzustreifen lib/aus ls -1, können Sie sed:

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

0

Sie können dies mit xargs mit dem Parameter --max-args (oder dem kürzeren Alias ​​-n) tun :

ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename

Beachten Sie, dass wir --quoting-style=csicherstellen, dass Leerzeichen in Dateinamen keine Xargs vermasseln.


Das habe ich nicht bemerkt. Vielen Dank! Fand dieses Juwel auf einer anderen Stapelbörse. Sie können ls-Ergebnisse mit --quoting-style = c in Anführungszeichen setzen. Der resultierende vollständige Befehl wäre also: `ls --quoting-style = c -1 lib / *. Jar | xargs --max-args 1 basename`
yoni

-1

Eine alternative Möglichkeit, Ihre Anfrage zu lösen, besteht darin, alle Dateien mit aufzulisten ls -R. Kombinieren Sie die Ausgabe des Befehls ls mit grep, um nur JAR-Dateien aufzulisten. Sie können den folgenden Befehl verwenden, um dasselbe für Ihre Abfrage zu tun:

ls -R lib | grep jar| grep -v jar*

Dies würde schwer scheitern, wenn es ein Unterverzeichnis gäbe, das auch JAR-Dateien enthält, oder eine Datei mit dem Namen "list-of-jars.txt".
Jules

grep -v jar * filtert die Ergebnisse mit einer Datei mit dem Namen Ihres zitierten Beispiels heraus.
joshi.mohit86

wahr. es würde auch alle beabsichtigten Dateien herausfiltern. Jetzt schaue ich es noch einmal an. Ich kann keine Umstände erkennen, unter denen der von Ihnen vorgeschlagene Befehl tatsächlich eine Ausgabe erzeugen würde ...
Jules

Nein, es würde Dateien wie anzeigen und Dateien wie mylib_2.jarherausfiltern list-of-jars.txt.
joshi.mohit86

Nein, das tut es nicht. Ich habe es einfach versucht. find development -name '*.jar' | wc -l-> 70. ls -R development | grep jar| grep -v jar*-> überhaupt keine Ausgabe.
Jules
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.