Pertanyaan Apa yang meluas ke semua file di direktori saat ini secara rekursif?


aku tahu **/*.ext meluas ke semua file di semua subdirektori yang cocok *.ext, tetapi apa ekspansi serupa yang mencakup semua file tersebut di arus direktori juga?


75
2017-11-06 22:07


asal


Jawaban:


Ini akan bekerja di Bash 4:

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

Agar glob asterik ganda berfungsi, maka globstar opsi perlu diatur (default: pada):

shopt -s globstar

Dari man bash:

    globstar
                  Jika disetel, pola ** digunakan dalam ekspansi ekspansi nama file
                  teks akan cocok dengan file dan nol atau lebih direktori dan
                  subdirektori. Jika polanya diikuti oleh /, saja
                  direktori dan subdirektori cocok.

91
2017-11-06 23:22



Ini akan mencetak semua file dalam direktori saat ini dan subdirektorinya yang berakhiran '.ext'.

find . -name '*.ext' -print

10
2017-11-06 22:11



Kamu dapat memakai: **/*.* untuk memasukkan semua file secara rekursif (diaktifkan oleh: shopt -s globstar).

Temukan pengujian di bawah ini dari variasi lain dan bagaimana mereka berperilaku.


Menguji folder dengan 3472 file dalam sampel VLC folder repositori:

(Total file 3472 dihitung sebagai per: find . -type f | wc -l)

  • ls -1 **/*.* - mengembalikan 3338
  • ls -1 {,**/}*.* - mengembalikan 3341 (seperti yang diusulkan oleh Dennis)
  • ls -1 {,**/}* - mengembalikan 8265
  • ls -1 **/* - mengembalikan 7817, kecuali file yang tersembunyi (seperti yang diusulkan oleh Dennis)
  • ls -1 **/{.[^.],}* - mengembalikan 7869 (seperti yang diusulkan oleh Dennis)
  • ls -1 {,**/}.?* - mengembalikan 15855
  • ls -1 {,**/}.* - mengembalikan 20321

Jadi saya pikir metode yang paling dekat untuk mendaftar semua file secara rekursif adalah contoh pertama (**/*.*) sesuai komentar gniourf-gniourf (dengan asumsi file memiliki ekstensi yang tepat, atau gunakan yang spesifik), sebagai contoh kedua memberikan beberapa duplikat seperti di bawah ini:

$ 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

dan yang lainnya menghasilkan duplikat lebih lanjut.


Untuk memasukkan file yang tersembunyi, gunakan: shopt -s dotglob (dinonaktifkan oleh shopt -u dotglob). Ini tidak disarankan, karena dapat mempengaruhi perintah seperti mv atau rm dan Anda dapat menghapus file yang salah secara tidak sengaja.


4
2018-04-19 14:28



$ find . -type f

Itu akan mencantumkan semua file di direktori saat ini. Anda kemudian dapat melakukan beberapa perintah lain pada output menggunakan -exec

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

Itu akan menyapih setiap file dari find untuk string "foo".


3
2017-11-06 22:10



Mengapa tidak menggunakan perluasan brace untuk menyertakan direktori saat ini juga?

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

Ekspansi brace terjadi sebelum ekspansi glob, sehingga Anda dapat secara efektif melakukan apa yang Anda inginkan dengan versi bash yang lebih lama, dan dapat mengorbankan monyet dengan globstar dalam versi yang lebih baru.

Juga, itu dianggap praktik yang baik di bash untuk memasukkan yang terkemuka ./ dalam pola glob Anda.


2
2018-05-09 23:30