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 -rf
perintah 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.js
dan foo.coffee
file, dapatkah kita melakukan sesuatu seperti rm -rf /tmp/foo.coffe[co]
menghapus /tmp/foo.js
?
command-line
bash
rm
aneeshep
sumber
sumber
-rf
sana, karena itu bukan direktori (--recursive
), atau tidak dapat ditulis (--force
).-rf
dan tidak perlu melakukan hal-hal sebagai root. Terutama jika hal-hal tersebut melibatkanrm -rf
.[co]
shell glob. Terima kasih.Jawaban:
[co]
bukan parameter untukrm
perintah - ini adalah shell glob yang cocok dengan pola yang sama dengan karakter tunggal dari set[co]
- dengan kata lain, itu cocok dengan ac
atauo
a akhir nama file. Dariman bash
:Untuk mencocokkan keduanya
foo.coffee
danfoo.js
, karena sufiks tidak mengandung substring yang umum sama sekali, yang terbaik yang dapat Anda lakukan adalahfoo.*
yang akan cocok dengan nama file yang dimulai denganfoo.
Sebaliknya Anda bisa menggunakan brace expansion misalnyasumber
[abc]
atau*
akan mencari file sementara{}
tidak. buka / tmp, ketikecho nya[ab]; echo nya{a,b}
, dulutouch nyaa
dan lagiecho nya[ab]; echo nya{a,b}
Ini bukan parameter tetapi kumpulan huruf (atau "shell glob"). Ini sama:
sama dengan
Mirip ...
akan menghapus apa pun mulai dari
/tmp/hello.pyc
dan termasuk/tmp/hello.pyo
mengikuti pemesanan ASCII.akan menghapus ...
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 ...
akan menghapus file seperti ini ...
jadi itu akan mencakup jauh lebih dari hanya 2 file ini.
sumber
rm -rf
dengan semua kecocokan, tidak banyak doa masing-masing dengan satu kecocokan.Ini adalah shell glob, mirip dengan wildcard
*
dan?
... di bash, pola nama file*.[co]
cocok dengan semua nama file yang diakhiri dengan.c
atau.o
.Perbedaannya dengan
*.[co]
versus*.c *.o
atau*.{c,o}
adalah bahwa dua pola terakhir akan berkembang menjadi dummy*.o
jika tidak.o
ada 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:sumber