Apa arti [co] dalam perintah “rm -rf filename [co]”?

16

Katakanlah saya memiliki dua file di /tmp:

root@ubuntu:~# touch /tmp/hello.{pyc,py}

root@ubuntu:~# ls /tmp/
hello.py  hello.pyc

Sekarang, mari jalankan rm -rfperintah dengan opsi [co]

root@ubuntu:~# rm -rf /tmp/hello.py[co]

root@ubuntu:~# ls /tmp/
hello.py

Bisakah seseorang tolong jelaskan apa yang terjadi di sini? Apa [co]parameternya? Bagaimana kita membuatnya berfungsi untuk ekstensi lain? Katakanlah saya punya foo.jsdan foo.coffeefile, dapatkah kita melakukan sesuatu seperti rm -rf /tmp/foo.coffe[co]menghapus /tmp/foo.js?

aneeshep
sumber
8
Tidak perlu di -rfsana, karena itu bukan direktori ( --recursive), atau tidak dapat ditulis ( --force).
deltab
13
Tidak perlu -rfdan tidak perlu melakukan hal-hal sebagai root. Terutama jika hal-hal tersebut melibatkan rm -rf.
terdon
Guys, contoh perintahnya hanya untuk menjelaskan masalah. Pertanyaan sebenarnya adalah tentang [co]shell glob. Terima kasih.
aneeshep
8
@aneeshep Jika seseorang melihat ke bawah laras pistol dan bertanya bagaimana cara membersihkannya, apakah Anda pertama kali memperingatkan mereka tentang melihat laras atau memberi tahu mereka cara membersihkannya?
Duncan X Simpson

Jawaban:

34

[co]bukan parameter untuk rmperintah - ini adalah shell glob yang cocok dengan pola yang sama dengan karakter tunggal dari set [co]- dengan kata lain, itu cocok dengan a catau oa akhir nama file. Dari man bash:

[...]  Matches any one of the enclosed characters

Untuk mencocokkan keduanya foo.coffeedan foo.js, karena sufiks tidak mengandung substring yang umum sama sekali, yang terbaik yang dapat Anda lakukan adalah foo.*yang akan cocok dengan nama file yang dimulai dengan foo.Sebaliknya Anda bisa menggunakan brace expansion misalnya

rm foo.{coffee,js}
Steeldriver
sumber
Yup mengerti. Saya melewatkan konsep dasar di bash;). Terima kasih :)
aneeshep
7
pola pencarian suka [abc]atau *akan mencari file sementara {}tidak. buka / tmp, ketik echo nya[ab]; echo nya{a,b}, dulu touch nyaadan lagiecho nya[ab]; echo nya{a,b}
Sanya_Zol
16

Ini bukan parameter tetapi kumpulan huruf (atau "shell glob"). Ini sama:

rm -rf /tmp/hello.py[co]

sama dengan

rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo

Mirip ...

rm -rf /tmp/hello.py[c-o]

akan menghapus apa pun mulai dari /tmp/hello.pycdan termasuk /tmp/hello.pyomengikuti pemesanan ASCII.

rm -rf /tmp/hello.py[ab][cd]

akan menghapus ...

rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd

katakanlah, saya punya file foo.js dan foo.coffee, bisakah kita melakukan sesuatu seperti rm -rf /tmp/foo.coffe[co]menghapus /tmp/foo.js.

Anda dapat membuat metode yang agak mewah tetapi untuk 2 file tersebut saya hanya menghapusnya dengan 1 perintah untuk masing-masingnya. Contoh lain mendapatkan sedekat mungkin dengan 2 file itu ...

rm /tmp/foo.[cj]*

akan menghapus file seperti ini ...

rm /tmp/foo.c*
rm /tmp/foo.j*

jadi itu akan mencakup jauh lebih dari hanya 2 file ini.

Rinzwind
sumber
2
Jika saya tidak salah paham, Anda mendapatkan satu doa rm -rfdengan semua kecocokan, tidak banyak doa masing-masing dengan satu kecocokan.
1
Iya. tapi bukan maksud dari rm yang saya tambahkan. itu hanya untuk menunjukkan apa yang perlu diketikkan sebagai yang setara ;-)
Rinzwind
1

Ini adalah shell glob, mirip dengan wildcard *dan ?... di bash, pola nama file *.[co]cocok dengan semua nama file yang diakhiri dengan .catau .o.

Perbedaannya dengan *.[co]versus *.c *.oatau *.{c,o}adalah bahwa dua pola terakhir akan berkembang menjadi dummy *.ojika tidak .oada file di direktori, sedangkan *.[co]versinya tidak.

Shell Glob berguna untuk melakukan operasi file dengan cara yang tidak peka huruf besar-kecil. Misalnya, jika Anda memiliki banyak file dengan nama file yang berakhir dengan jpg, JPG, Jpg, JPg, dll ... dan Anda ingin menghapus semua dari mereka, Anda dapat melakukan:

rm *.[Jj][Pp][Gg]
delt
sumber