Saya ingin menulis sesuatu seperti ini:
$ ls **.py
untuk mendapatkan semua nama file .py, berjalan secara hierarki hierarki direktori.
Bahkan jika ada file .py untuk ditemukan, shell (bash) memberikan output ini:
ls: cannot access **.py: No such file or directory
Adakah cara untuk melakukan apa yang saya inginkan?
EDIT: Saya ingin menentukan bahwa saya tidak tertarik pada kasus spesifik ls
, tetapi pertanyaannya adalah tentang sintaks glob.
nullglob
nullglob
, saya akan sangat menyarankan membaca peringatan berikut .wc -l {**,.}/*.py
bekerja dengan baik** tidak melakukan apa pun lebih dari satu *, keduanya beroperasi di direktori saat ini
sumber
find
jika Anda tidak memiliki bash 4. Contoh:yourcommand `find . -name '*.py'`
(perhatikan backticks);find . -name '*.py' -exec yourcommand {} \;
.Sejak Bash 4 (juga termasuk zsh) opsi globbing baru (
globstar
) telah ditambahkan yang memperlakukan pola secara**
berbeda ketika diatur.Ini cocok dengan pola wildcard dan mengembalikan nama file dan direktori yang cocok kemudian dengan mengganti pola wildcard dalam perintah dengan item yang cocok.
Biasanya ketika Anda menggunakan
**
, itu berfungsi mirip dengan*
, tetapi itu kambuh semua direktori secara rekursif (seperti loop).Untuk melihat apakah itu diaktifkan, periksa dengan
shopt globstar
(dalam skrip, gunakanshopt -q globstar
).Contoh
**.py
ini hanya akan berfungsi untuk direktori saat ini, karena tidak mengembalikan daftar direktori yang dapat diulang, jadi itu sebabnya Anda perlu menggunakan beberapa wildcard tingkat direktori**/*.py
, sehingga bisa masuk lebih dalam.Silakan temukan pada SO beberapa tes sintaks yang saya lakukan untuk menemukan semua file secara rekursif.
sumber