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)?

Jawaban:



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.


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'

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.


Aku tidak pernah mengatakan akan menguraikannya, dan Rush memiliki jawaban yang jauh lebih baik. Terima kasih telah mencoba, :)
neu242
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.