daftar file dengan pola dengan awal dan akhir

9

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

unix_dude
sumber
ls -1 | grep "abc$(your_date).zip" ?
Stan Strum

Jawaban:

15

lstidak 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 printfuntuk dicetak:

printf '%s\n' abc*.zip

Anda juga bisa meneruskannya ke ls -luntuk menampilkan atribut dari file-file itu:

ls -ld abc*.zip

(kita perlu -dkarena jika salah satu dari file tersebut adalah dari direktori jenis , lsakan membuat daftar isinya sebaliknya).

Atau untuk unzipmengekstraknya jika hanya unzipbisa mengekstraksi lebih dari satu file sekaligus. Sayangnya tidak, jadi Anda harus menggunakan xargs -n1atau formengulang:

printf '%s\0' abc*.zip | xargs -r0n1 unzip

Atau:

for file in abc*.zip; do unzip "$file"; done

Tetapi pada kenyataannya, unzipmenjadi lebih seperti port dari perintah MS-DOS, unzipitu sendiri akan memperlakukan argumennya sebagai sebuah bola. Dengan kata lain, unzip 'abc*.zip'tidak akan meng-unzip file yang dipanggil abc*.zip(nama file yang benar-benar valid di Unix, bukan pada sistem operasi Microsoft), tetapi file-file tersebut cocok dengan abc*.zippolanya, jadi Anda sebenarnya ingin:

 unzip 'abc*.zip'

(Sebenarnya pendekatan kami xargsdan di foratas akan salah, karena jika ada file yang dipanggil abc*.zipmisalnya, unzipakan memperlakukannya sebagai pola! Lihat bsdtarcara yang lebih aneh untuk mengekstrak ziparsip)


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:

    setopt extendedglob
    ls -ld (#i)abc*.zip
    

    Atau:

    ls -ld ((#i)abc)*.zip
    

    jika Anda hanya ingin abcbagiannya menjadi case-sensitive.

  • ksh93:

    ls -ld ~(i)abc*.zip
    

    atau:

    ls -ld ~(i:abc)*.zip
    
  • dengan bash.

    shopt -s nocaseglob
    ls -ld abc*.zip
    

    (tidak ada cara untuk memiliki hanya bagian-bagian dari kasus gumpalan yang sensitif di sana selain dengan menggunakan sintaks portabel).

  • dengan yash:

    set +o case-glob
    ls -ld abc*.zip
    

    komentar yang sama seperti di bashatas.

Stéphane Chazelas
sumber
9
ls abc*.zip

Namun ini akan gagal jika ada terlalu banyak file (ada batas untuk ekspansi shell dalam hal berapa banyak argumen yang dapat diperluas ke).

find . -name "abc*.zip"

Ini mungkin yang paling universal. Kutipan harus ada di sana. Dengan beberapa findimplementasi, Anda juga dapat menggunakan -inamealih-alih -nameuntuk pencarian case-sensitive ( aBc<date>.ZIPjuga cocok).

ls | grep -x "abc.*\.zip"

Pikirkan .*dan \.karena penggunaan grep filter adalah regex yang berbeda dari notasi wildcard yang digunakan shell untuk ekspansi. Gunakan grep -iuntuk pencarian case-sensitive.

Jan Dusek
sumber
1
Perhatikan bahwa batas itu bukan batas shell. Ini adalah batas kernel dalam execve()panggilan sistem.
Stéphane Chazelas
Mungkin perlu dicatat bahwa findakan mencari file-file di subdirektori juga. Gunakan find . ! -name . -prune -name 'abc*.zip' -printatau find . -maxdepth 1 -name 'abc*.zip'jika finddukungan Anda -maxdepthsuka pada GNU atau BSD atau find . -depth 1 -name 'abc*.zip'jika Anda findmendukung -depth <n>sejenisnya pada beberapa BSD untuk membatasi ke direktori saat ini.
Stéphane Chazelas
$ ls ../*.abekerja untuk saya (daftar arsip dalam direktori induk).
Daniel
0

Coba gunakan ls abc*.zipuntuk 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.

Jeff
sumber
-1

Anda harus menentukan direktori tempat lspencarian dalam sebuah contoh

ls -la ~/file*.* 
ls -la ./file*.*

itu berfungsi untuk saya, tetapi jelas itu tidak mendukung pencarian berdasarkan pola

Kevin Montalvo
sumber
1
Ini tidak menjawab pertanyaan; file harus dimulai dengan abcdan diakhiri dengan .zip.
Jeff Schaller