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/*.jar
und 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 lib
Erstellen 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 ls
aber ich habe keine Lösung gefunden.
Eine Lösung mit einem anderen Kommando wäre gut, solange ich es an mein ls
Kommando weiterleiten kann oder autark.
Antworten:
Anstatt ls zu analysieren , sollten Sie
find
stattdessen verwenden. Dann können Sie auchbasename
für jede Datei ausführen , um die führenden Verzeichnisse zu entfernen:quelle
-maxdepth
Option.Mit GNU
find
muss nichtbasename
für jede einzelne Datei ausgeführt werden, dies ist viel schneller (besonders wenn es viele Dateien gibt):quelle
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.quelle
printf '%s\n' *.jar
, um jede Datei in einer anderen Zeile zu bekommen.printf '%s\0' *.jar
, um Leerzeichenprobleme zu beseitigen (obwohl dies nicht das Q ist).Wie Josh Jolly in seiner Antwort sagte, sollten Sie niemals analysieren
ls
, sondern den Ansatz in seiner Antwort verwenden. Hier ist eineawk
Lösung zum Entfernen von Pfaden aus Dateinamen. Verwenden Sie sie nur nicht mit ls:Das
-F'/'
setzt das Feldtrennzeichen,/
was bedeutet, dass das letzte Feld$NF
der Dateiname ist.quelle
find
der Weg ist wahrscheinlich zu gehen, aber wenn Sie wirklich, wirklich tun (Sie dies nicht tun) wollen abzustreifenlib/
ausls -1
, können Siesed
:quelle
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=c
sicherstellen, dass Leerzeichen in Dateinamen keine Xargs vermasseln.quelle
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:quelle
mylib_2.jar
herausfilternlist-of-jars.txt
.find development -name '*.jar' | wc -l
->70
.ls -R development | grep jar| grep -v jar*
-> überhaupt keine Ausgabe.