Saya ingin mendaftar semua file dalam folder bernama foldername
yang memiliki ekstensi test
, atest
atau btest
.
Pikiranku adalah berlari ls ./foldername/*.{a,b,}test
Ini berfungsi dengan baik kecuali tidak ada apa-apa dengan ekstensi atest
, dalam hal ini saya mendapatkan kesalahan zsh: no matches found: ./foldername/*.atest
.
Apakah ada cara saya bisa mengabaikan kesalahan ini dan mencetak file yang ada?
Saya perlu ini bekerja di ZSH dan BASH.
/dev/null
?Jawaban:
Mungkin lebih baik melakukan ini dengan
find
:sumber
-maxdepth 1
, untuk lebih dekat meniruls
perilaku-maxdepth
adalah ekstensi GNU. Catatan 3 perbedaan lain dengan gumpalan:find
akan menyertakan file tersembunyi, tidak mengurutkan daftar dan gagal mencocokkan nama file yang mengandung byte yang tidak membentuk karakter yang valid (seperti$'St\xe9phane.atest'
di dalam lokal UTF-8)Di
{a,b,...}
bukan operator glob, itu penjepit ekspansi, yang pertama kali diperluas ke:Dan setiap bola berkembang secara individual, dan jika ada bola yang tidak cocok, perintah dibatalkan seperti yang Anda harapkan di
zsh
(ataufish
; dibash
, Anda membutuhkanfailglob
opsi untuk mendapatkan perilaku yang sama).Di sini, Anda ingin menggunakan satu bola yang cocok dengan semua file itu, dan hanya membatalkan perintah jika bola itu tidak cocok dengan file apa pun:
Anda tidak ingin menggunakan
nullglob
, seolah-olah tidak ada gumpalan yang cocok, itu akan berjalanls
tanpa argumen, jadi daftar direktori saat ini.cshnullglob
lebih baik dalam hal itu karena menghapus gumpalan yang tidak cocok tetapi masih membatalkan perintah jika semua gumpalan gagal untuk mencocokkan.Anda tidak akan mau menggunakan
nonomatch
, karena itu akan memberi Anda perilaku yang rusakbash
yang akan memalukan.Untuk alternatif gumpalan yang bekerja di keduanya
zsh
danbash
, Anda bisa menggunakan gumpalan ksh (set -o kshglob
dalamzsh
danshopt -s extglob
dalambash
).Maka, Anda akan melakukan:
atau:
Tambahkan
failglob
opsibash
untuk menghindari gumpalan diteruskan secara harfiah kels
saat tidak cocok.Lihat Mengapa nullglob tidak default? untuk informasi lebih lanjut.
sumber
?(...)
atau+(...)
untuk bash.