gunakan rm untuk menghapus file dan direktori secara rekursif

17

apakah mungkin menggunakan rm untuk menghapus file dan direktori yang cocok dengan suatu pola secara rekursif tanpa menggunakan perintah lain?

pengguna15586
sumber

Jawaban:

35

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
warren
sumber
1
benar - jika Anda meninggalkan keluar pipa terakhir, Anda akan mendapatkan daftar semua pertama :)
warren
2
Mungkin tidak langsung menjawab pertanyaan poster, tetapi adalah yang terdekat mereka akan mendapatkan apa yang mereka inginkan.
Drakia
1
A Dwarf, bukankah itu sedikit pahit tanpa alasan?
Gnoupi
10
Harap berhati-hati dalam menggunakannya 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 rmakan jauh lebih kuat. Ini berarti, namun Anda tidak dapat menggunakan grepdan harus menggunakan findpredikat untuk mencocokkan dan mencetak hanya file yang diinginkan. Contoh kedua warren akan lebih kuat find -type f -name '*~' -print0 | xargs -0 rm.
Chris Johnsen
1
Jika Anda ingin satu perintah untuk melakukan pekerjaan itu, buatlah alias menggunakan salah satu perintah temukan yang diberikan. Akan mengisi jawaban untuk ini nanti, jika diinginkan.
casualuser
8

"tanpa menggunakan perintah lain"

Tidak.

Drakia
sumber
Jawaban yang bagus menggambarkan "ketat menjawab pertanyaan awal (dengan risiko tidak dapat memberikan solusi)" vs.
Gnoupi
Saya hanya memposting ini karena "A Dwarf" mengeluh tentang jawaban yang sebenarnya memberikan solusi. Tanpa menggunakan perintah lain benar-benar tidak ada cara untuk melakukan penghapusan file rekursif yang cocok dengan suatu pola, hanya penghapusan direktori file / direktori saat ini.
Drakia
3

Menggunakan Bash, dengan globstarset, ya :

rm basedir/**/my*pattern*

Cobalah dengan mis ls -1terlebih dahulu, sebelum rmmendaftar file yang cocok.

Anda mengatur opsi melalui mis shopt -s globstar.


Atau, findvarian 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 rmke rm -rdalam perintah di atas dan lewati pencocokan hanya -type fdi findperintah.

Daniel Andersson
sumber
0

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.

masa depan
sumber
Ini tidak akan berfungsi karena polanya diperluas oleh shell di direktori saat ini. Jika dikutip, polanya menjadi nama file dengan karakter khusus di dalamnya. misalnya untuk menghapus file [, orang dapat menulis rm '['. Pola itu kehilangan artinya.
casualuser
0

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.

kaleissin
sumber