Anda mungkin tertarik pada "orang miskin find":
shopt -s globstar
shopt -s s ets opsi shell bernama. The globstarpilihan didefinisikan sebagai berikut di bash (1) :
Jika diatur, pola yang **digunakan dalam konteks ekspansi nama file / pathname akan cocok dengan file [sic] dan nol atau lebih direktori dan subdirektori. Jika polanya diikuti oleh /, hanya direktori dan subdirektori yang cocok.
Jadi, setelah Anda selesai shopt -s globstar, salah satu dari perintah berikut:
ls -d1 - source / ** # Karakter setelah 'd' adalah digit.
ls -d - source / ** | cat # ie, ia akan menuliskannya ke dalam pipa untuk perintah apa pun
sumber printf "% s \ n" / **
akan menghasilkan output:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
Sayangnya, ini termasuk nama direktori juga. Mungkin sedikit membantu Anda untuk mengetahui hal itu
printf "%s\n" source/**/
akan menghasilkan output:
source/
source/fonts
source/images
yaitu, hanya nama direktori. Anda mungkin mengarahkan output dari salah satu set pertama perintah untuk satu file, mengarahkan output di atas ke file kedua, dan kemudian menggunakan comm, diffatau sesuatu yang mirip, untuk mengurangi file kedua dari yang pertama, hanya menyisakan dataran file (non-direktori). Tapi jangan lakukan itu.
Pendekatan lain (itu tidak jauh lebih baik) adalah
ls -d --file-type -- source/** | grep -v '/$'
The --file-typepilihan memberitahu lsuntuk menampilkan /
pada akhir setiap nama direktori (dan karakter lain di ujung lainnya (khusus) jenis file), seperti ini:
sumber // # Menambahkan satu
sumber tambahan / font / # Menambahkan satu
sumber / font / fontello
sumber / gambar / # Ditambahkan satu
sumber / gambar / bg1.png
sumber / gambar / eng.png
sumber / gambar / fra.png
dan kemudian grep -v '/$'menghapus garis yang diakhiri dengan /; yaitu, nama direktori. Sayangnya, --file-typeopsi ini tidak ditentukan oleh POSIX . Jika versi lsAnda tidak mendukungnya, gunakan -F. Itu seperti --file-type
kecuali itu juga menampilkan a *di ujung nama file executable, yang beberapa orang merasa menjengkelkan. Anda dapat menghilangkannya dengan sed:
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
Jika Anda ingin melakukan sesuatu dengan semua file (dan hanya file), Anda dapat melakukannya
untuk f dalam sumber / **
melakukan
jika [-f "$ f"]
kemudian
Masukkan perintah untuk diterapkan ke file biasa di sini.
fi
selesai
Catatan:
- Ketika
lsmengeluarkan ke terminal, dan itu tidak dalam mode -l( l ong), itu menulis beberapa nama per baris (kecuali nama-nama sangat panjang). Anda dapat memaksanya untuk menulis satu nama per baris dengan menentukan -1(satu), atau dengan mengarahkan output ke file atau pipa.
- Anda mungkin tidak benar-benar membutuhkan
--dalam lsperintah karena Anda daftar direktori yang isinya Anda buat. Anda harus menggunakannya saat mendaftar *di direktori yang tidak dikenal, sebagai perlindungan terhadap nama file yang dimulai dengan -.
- Jangan mencoba mengurai output dari
ls.
- The
globstarpilihan shell tampaknya tidak didefinisikan oleh POSIX. (Faktanya, saya tidak yakin POSIX mengenali opsi shell apa pun .) Meskipun sepertinya bashisme, waspadalah - ini mungkin tidak ada di semua versi bash.
Jika fontsatau imagesmemiliki subdirektori, **akan mendaftar semuanya, secara rekursif, sepenuhnya. Salah satu (agak kotor dan tidak dapat diandalkan) cara untuk membatasi kedalaman adalah
ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
yang menghilangkan garis yang mengandung tiga /karakter atau lebih .
findsalah juga; terutama, jika Anda menjalankanfor file in $(find ...), Anda telah memukul salah satu dari mereka).