Frage Was rekursiv auf alle Dateien im aktuellen Verzeichnis expandiert?


Ich kenne **/*.ext expandiert auf alle Dateien in allen übereinstimmenden Unterverzeichnissen *.ext, aber was ist eine ähnliche Erweiterung, die alle diese Dateien in der Strom Verzeichnis auch?


75
2017-11-06 22:07


Ursprung


Antworten:


Dies funktioniert in Bash 4:

ls -l {,**/}*.ext

Damit der Doppelstern-Glob funktioniert, globstar Option muss gesetzt sein (Standard: ein):

shopt -s globstar

Von man bash:

    globstar
                  Wenn dies eingestellt ist, wird das Muster ** in einer Dateinamenserweiterung verwendet.
                  Text entspricht einer Datei und null oder mehr Verzeichnissen und
                  Unterverzeichnisse. Wenn dem Muster nur ein / folgt
                  Verzeichnisse und Unterverzeichnisse stimmen überein.

91
2017-11-06 23:22



Dadurch werden alle Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen gedruckt, die mit ".ext" enden.

find . -name '*.ext' -print

10
2017-11-06 22:11



Sie können verwenden: **/*.* alle Dateien rekursiv einschließen (aktivieren durch: shopt -s globstar).

Im Folgenden finden Sie Tests anderer Varianten und deren Verhalten.


Testen des Ordners mit 3472 Dateien im Beispiel VLC Repository-Ordner:

(Insgesamt 3472 Dateien gezählt nach: find . -type f | wc -l)

  • ls -1 **/*.* - gibt 3338 zurück
  • ls -1 {,**/}*.* - gibt 3341 zurück (wie von. vorgeschlagen) Dennis)
  • ls -1 {,**/}* - gibt 8265 zurück
  • ls -1 **/* - gibt 7817 zurück, außer versteckte Dateien (wie von Dennis)
  • ls -1 **/{.[^.],}* - gibt 7869 zurück (wie von. vorgeschlagen) Dennis)
  • ls -1 {,**/}.?* - gibt 15855 zurück
  • ls -1 {,**/}.* - gibt 20321 zurück

Also denke ich, dass die nächstliegende Methode, um alle Dateien rekursiv aufzulisten, das erste Beispiel ist (**/*.*) gemäß gniourf-gniourf Kommentar (Angenommen, die Dateien haben die richtigen Erweiterungen, oder verwenden Sie die spezifische Erweiterung), da das zweite Beispiel einige weitere Duplikate wie folgt enthält:

$ diff -u <(ls -1 {,**/}*.*) <(ls -1 **/*.*)
--- /dev/fd/63  2015-04-19 15:25:07.000000000 +0100
+++ /dev/fd/62  2015-04-19 15:25:07.000000000 +0100
@@ -1,6 +1,4 @@
 COPYING.LIB
-COPYING.LIB
-Makefile.am
 Makefile.am
@@ -45,7 +43,6 @@
 compat/tdestroy.c
 compat/vasprintf.c
 configure.ac
-configure.ac

und die anderen erzeugen noch weitere Duplikate.


Verwenden Sie zum Einschließen versteckter Dateien: shopt -s dotglob (deaktivieren durch shopt -u dotglob). Es wird nicht empfohlen, da es Befehle wie z mv oder rm und Sie können versehentlich die falschen Dateien entfernen.


4
2018-04-19 14:28



$ find . -type f

Dadurch werden alle Dateien im aktuellen Verzeichnis aufgelistet. Sie können dann einen anderen Befehl für die Ausgabe mit -exec ausführen

$find . -type f -exec grep "foo" {} \;

Das wird jede Datei von der Suche für die Zeichenfolge "foo" grep.


3
2017-11-06 22:10



Warum nicht einfach die geschweifte Erweiterung verwenden, um auch das aktuelle Verzeichnis einzuschließen?

./{*,**/*}.ext

Klammerexpansion findet vor der Globexpansion statt, so dass du effektiv mit älteren Versionen von bash machen kannst, was du willst, und in neueren Versionen auf Monkeying mit globstar verzichten kannst.

Es wird auch als gute Übung in bash angesehen, die Führung mit einzubeziehen ./ in deinen Glob-Mustern.


2
2018-05-09 23:30