Anda mungkin tertarik pada "orang miskin find
":
shopt -s globstar
shopt -s
s ets opsi shell bernama. The globstar
pilihan 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
, diff
atau 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-type
pilihan memberitahu ls
untuk 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-type
opsi ini tidak ditentukan oleh POSIX . Jika versi ls
Anda 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
ls
mengeluarkan 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 ls
perintah 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
globstar
pilihan shell tampaknya tidak didefinisikan oleh POSIX. (Faktanya, saya tidak yakin POSIX mengenali opsi shell apa pun .) Meskipun sepertinya bash
isme, waspadalah - ini mungkin tidak ada di semua versi bash.
Jika fonts
atau images
memiliki 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 .
find
salah juga; terutama, jika Anda menjalankanfor file in $(find ...)
, Anda telah memukul salah satu dari mereka).