Dalam bash saya sering menggunakan for-loop seperti berikut ini
for file in *.type; do
sommecommand "$file";
done;
untuk melakukan operasi untuk semua file yang cocok *.type
. Jika tidak ada file dengan akhiran ini ditemukan di direktori yang berfungsi tanda bintang tidak diperluas dan biasanya saya akan mendapatkan pesan kesalahan mengatakan bahwa seseorang tidak menemukan file. Saya dapat segera memikirkan beberapa cara untuk menghindari kesalahan ini. Namun menambahkan persyaratan sepertinya tidak terlalu elegan. Apakah ada cara yang singkat dan bersih untuk mencapai ini?
*.txt
. Akan sangat berharga untuk memeriksa jika file tersebut ada.break
alih - alihcontinue
).Di bash, Anda dapat menggunakan
shopt -s nullglob
untuk memperluas ke array kosong jika tidak ada yang cocok.Di shell POSIX tanpa
nullglob
, Anda dapat menghindari masalah ini dengan memeriksa bahwa nama file yang diteruskan benar-benar ada dengan memiliki[ -e "$file" ] || [ -L "$file" ] || continue
sebagai bagian pertama darifor
loop Anda .sumber
[ -e
akan mengembalikan false untuk file yang tidak dapat diakses atau file yang merupakan symlink ke file yang tidak dapat diakses atau tidak ada.chmod 0 the_file
,[ -e the_file ]
masih mengevaluasi benar, jadi itu pasti sesuatu yang lain.mkdir -p x/{a,b} && chmod 444 x && echo x/* && [ -e x/a ]
,. x / a tidak dapat diakses tetapi karena x dapat dibaca x / * akan berkembang.Teknik biasa untuk kerang yang tidak memiliki
nullglob
pilihan adalahEkstra
[*].type
adalah untuk menutupi kasus di mana ada satu file yang dipanggil*.type
di direktori saat ini.Sekarang, jika Anda ingin memasukkan file dot, itu menjadi lebih rumit .
Saya percaya bahwa teknik ini diciptakan oleh Laura Fairhead di usenet beberapa tahun yang lalu.
sumber
find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"
Ini menghilangkan
for
loop dan globbing shell dari persamaan sepenuhnya.find
akan mengeksekusi-exec
perintah sekali per pertandingan, dan jika tidak ada pertandingan, itu tidak akan pernah dieksekusi. The-maxdepth 0
menginstruksikan menemukan tidak recurse ke dalam subdirektori bernama jalan-argumen (.
dalam hal ini).Kelemahannya adalah ia melibatkan aplikasi lain, meskipun ada yang hadir di hampir setiap sistem Linux di luar sana (dan mungkin sebagian besar Unix juga).
sumber