Saya ingin daftar semua file dalam direktori yang dimulai dengan 'abc' dan diakhiri dengan '.zip'
Saya mencoba menggunakan ls
.
Direktori ini memiliki banyak file zip yang dimulai dengan abc<date>
dan xvz<date>
. Saya hanya ingin mendapatkan daftarabc<date>.zip
ls -1 | grep "abc$(your_date).zip"
?Jawaban:
ls
tidak melakukan pencocokan pola pada nama file. Itu hanya daftar isi direktori dan file yang diberikan sebagai argumen.Shell Anda di sisi lain memiliki fitur yang disebut globbing atau nama file generasi yang memperluas pola menjadi daftar file yang cocok dengan pola itu.
Di sini pola gumpalan itu akan menjadi
abc*.zip
(*
menjadi wildcard yang mewakili sejumlah karakter ).Anda akan meneruskannya ke perintah apa pun yang Anda suka seperti
printf
untuk dicetak:Anda juga bisa meneruskannya ke
ls -l
untuk menampilkan atribut dari file-file itu:(kita perlu
-d
karena jika salah satu dari file tersebut adalah dari direktori jenis ,ls
akan membuat daftar isinya sebaliknya).Atau untuk
unzip
mengekstraknya jika hanyaunzip
bisa mengekstraksi lebih dari satu file sekaligus. Sayangnya tidak, jadi Anda harus menggunakanxargs -n1
ataufor
mengulang:Atau:
Tetapi pada kenyataannya,
unzip
menjadi lebih seperti port dari perintah MS-DOS,unzip
itu sendiri akan memperlakukan argumennya sebagai sebuah bola. Dengan kata lain,unzip 'abc*.zip'
tidak akan meng-unzip file yang dipanggilabc*.zip
(nama file yang benar-benar valid di Unix, bukan pada sistem operasi Microsoft), tetapi file-file tersebut cocok denganabc*.zip
polanya, jadi Anda sebenarnya ingin:(Sebenarnya pendekatan kami
xargs
dan difor
atas akan salah, karena jika ada file yang dipanggilabc*.zip
misalnya,unzip
akan memperlakukannya sebagai pola! Lihatbsdtar
cara yang lebih aneh untuk mengekstrakzip
arsip)Untuk pencocokan yang tidak sensitif, Anda dapat menggunakan
[aA][bB][cC]*.[zZ][iI][pP]
portable. Beberapa shell telah memperpanjang operator globbing untuk pencocokan case-sensitive:zsh
:Atau:
jika Anda hanya ingin
abc
bagiannya menjadi case-sensitive.ksh93
:atau:
dengan
bash
.(tidak ada cara untuk memiliki hanya bagian-bagian dari kasus gumpalan yang sensitif di sana selain dengan menggunakan sintaks portabel).
dengan
yash
:komentar yang sama seperti di
bash
atas.sumber
Namun ini akan gagal jika ada terlalu banyak file (ada batas untuk ekspansi shell dalam hal berapa banyak argumen yang dapat diperluas ke).
Ini mungkin yang paling universal. Kutipan harus ada di sana. Dengan beberapa
find
implementasi, Anda juga dapat menggunakan-iname
alih-alih-name
untuk pencarian case-sensitive (aBc<date>.ZIP
juga cocok).Pikirkan
.*
dan\.
karena penggunaan grep filter adalah regex yang berbeda dari notasi wildcard yang digunakan shell untuk ekspansi. Gunakangrep -i
untuk pencarian case-sensitive.sumber
execve()
panggilan sistem.find
akan mencari file-file di subdirektori juga. Gunakanfind . ! -name . -prune -name 'abc*.zip' -print
ataufind . -maxdepth 1 -name 'abc*.zip'
jikafind
dukungan Anda-maxdepth
suka pada GNU atau BSD ataufind . -depth 1 -name 'abc*.zip'
jika Andafind
mendukung-depth <n>
sejenisnya pada beberapa BSD untuk membatasi ke direktori saat ini.$ ls ../*.a
bekerja untuk saya (daftar arsip dalam direktori induk).Coba gunakan
ls abc*.zip
untuk mempersempit hasil dengan yang cocok dengan kriteria Anda untuk string awal abc dan akhir .zip asterisk akan diperluas untuk mencocokkan hasil tersebut tanpa menyertakan karakter awal xvz.sumber
Anda harus menentukan direktori tempat
ls
pencarian dalam sebuah contohitu berfungsi untuk saya, tetapi jelas itu tidak mendukung pencarian berdasarkan pola
sumber
abc
dan diakhiri dengan.zip
.