apakah mungkin menggunakan rm untuk menghapus file dan direktori yang cocok dengan suatu pola secara rekursif tanpa menggunakan perintah lain?
apakah mungkin menggunakan rm untuk menghapus file dan direktori yang cocok dengan suatu pola secara rekursif tanpa menggunakan perintah lain?
Jawaban:
Untuk langsung menjawab pertanyaan Anda, "tidak - Anda tidak dapat melakukan apa yang Anda gambarkan dengan rm
".
Namun, Anda dapat melakukannya dengan menggabungkannya find
. Inilah salah satu dari banyak cara Anda dapat melakukan itu:
# search for everything in this tree, search for the file pattern, pipe to rm
find . | grep <pattern> | xargs rm
Misalnya, jika Anda ingin mem-nuke semua file * ~, Anda bisa melakukannya:
# the $ anchors the grep search to the last character on the line
find . -type f | grep '~'$ | xargs rm
Untuk memperluas dari komentar * :
# this will handle spaces of funky characters in file names
find -type f -name '*~' -print0 | xargs -0 rm
find | grep | xargs rm
. Jika ada file dengan spasi (atau baris baru), ini akan pecah (dan tergantung pada nama file dan di mana spasi) mungkin menghapus hal-hal yang tidak ingin Anda hapus. find … -print0 | xargs -0 rm
akan jauh lebih kuat. Ini berarti, namun Anda tidak dapat menggunakan grep
dan harus menggunakan find
predikat untuk mencocokkan dan mencetak hanya file yang diinginkan. Contoh kedua warren akan lebih kuat find -type f -name '*~' -print0 | xargs -0 rm
.
"tanpa menggunakan perintah lain"
Tidak.
Menggunakan Bash, dengan globstar
set, ya :
rm basedir/**/my*pattern*
Cobalah dengan mis ls -1
terlebih dahulu, sebelum rm
mendaftar file yang cocok.
Anda mengatur opsi melalui mis shopt -s globstar
.
Atau, find
varian yang lebih pendek :
find -type f -name 'my*pattern*' -delete
atau untuk GNU find
:
find -type f -name 'my*pattern*' -exec rm {} +
atau alternatif lain untuk non-GNU find
(sedikit lebih lambat):
find -type f -name 'my*pattern*' -exec rm {} \;
Untuk juga menghapus direktori, seperti yang Anda minta: cukup ubah rm
ke rm -r
dalam perintah di atas dan lewati pencocokan hanya -type f
di find
perintah.
Saya akan mengasumsi "rm -rf" di mana kombinasi nama file, dan pola yang cocok seperti * dan? dll (mis. todays_log_2009 ????. log). Itu akan mulai dari Dir saat ini dan bekerja secara rekursif menghapus file yang sesuai dengan pola itu.
Jika Anda menggunakan zsh (1) , aktifkan "extended globbing" dengan setopt extendedglob
.zshrc. Awalan pola dengan '** /' akan dihapus secara rekursif:
% rm -rf ** / <pola>
Namun, jika ada banyak file yang harus Anda hapus, Anda harus mencari (1) dengan xargs (1) atau -exec, dan saya juga merekomendasikan melakukannya di skrip shell.