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?


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}

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.


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]
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.