Bagaimana cara memilih file tertentu di direktori yang berbeda menggunakan bash?

13

Saya ingin mendaftar (atau menghapus, atau melakukan beberapa operasi lain) pada file tertentu dalam direktori, seperti ini:

$ ls /opt/somedir/
aa  bb  cc  aa.txt  bb.txt  cc.txt
$ ls /opt/somedir/(aa|bb|cc)  ## pseudo-bash :p
aa  bb  cc

Bagaimana saya bisa mencapai ini (tanpa cd-ing ke direktori terlebih dahulu)?

neu242
sumber

Jawaban:

22

Gunakan kurung kurawal untuk itu:

ls /opt/somedir/{aa,bb,cc}

Untuk informasi lebih lanjut, baca tentang ekspansi brace .

buru-buru
sumber
3

Di bawah bash, jalankan shopt -s extglob(atau letakkan di Anda ~/.bashrc), dan Anda dapat menggunakan pola tambahan yang memberikan ekspresi reguler dengan sintaks yang tidak biasa (diwarisi dari ksh). Anda dapat menggunakan pola-pola ini di ksh juga, tentu saja, dan juga di zsh setelahnya setopt ksh_glob.

$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Di zsh, Anda dapat langsung menggunakan (foo|bar)sebagai pola.

% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Perhatikan bahwa perintah ini disebut dengan path lengkap. Jika Anda ingin memanggil perintah dengan jalur pendek, Anda harus mengubah direktori, dan(cd /opt/somedir && somecommand aa bb cc) sejauh ini merupakan cara termudah.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Jika Anda melihat lebih dekat, Anda akan melihat bahwa saya menentukan "tanpa melakukan cd ke direktori terlebih dahulu" dalam pertanyaan saya;)
neu242
1

Anda dapat memfilter menggunakan egrep :

ls | egrep '(aa|bb|cc)'

Untuk menemukan semua file teks:

ls | egrep '(aa|bb|cc).txt'
Lautan
sumber
1
dot akan cocok dengan setiap karakter, dan pendekatan ini mempersulit pengoperasian lebih lanjut pada file-file ini
enzotib
1
Saya merasa bahwa ls hanyalah contoh perintah.
Random832
Yup, Anda benar, saya menentukan bahwa saya ingin melakukan operasi: daftar file hanyalah sebuah contoh.
neu242
Komentar yang baik teman-teman terkasih, terima kasih. Semoga beruntung neu242: D
Ocean
1

Pertama, saya mengarahkan Anda ke: jangan pernah menguraikan , selamanya . Cara yang tepat dan kanonik untuk melakukan apa yang Anda inginkan adalah dengan find .

Sebagai contoh:

find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;

Saya biasanya menggunakan -name bukan -regexkarena lebih sederhana. Tapi sebuah regex cocok untuk Anda gunakan. Anda harus menjalankan perintah tanpa -exec pertama kali, untuk memastikan itu sebenarnya adalah file yang ingin Anda pindahkan / hapus.

Spencer Rathbun
sumber
Aku tidak pernah mengatakan akan menguraikannya, dan Rush memiliki jawaban yang jauh lebih baik. Terima kasih telah mencoba, :)
neu242