Cara menghapus folder dengan nama tertentu

139

Di Linux, bagaimana cara menghapus folder dengan nama tertentu yang berada jauh di dalam hierarki folder?

Jalur berikut berada di bawah folder dan saya ingin menghapus semua folder yang bernama a.

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

Perintah Linux apa yang harus saya gunakan dari folder induk?

Joe
sumber
Mungkin melewatkan intinya tetapi mungkin itu membantu seseorang: Saya memiliki 410 folder di folder utama - masing-masing dari 410 dengan dua sub-folder. Semua sub-folder pertama dinamai 'final' dan berisi pdf yang diedit dan daftar konten Word. Semua sub-folder kedua bernama tif_pdf_various_names berisi file tiff-to tiff yang dipindai (sebagian hingga 200 halaman), pdf yang tidak diedit dan draft daftar isi .docx - sehingga merupakan kumpulan pekerjaan rumahan. Saya perlu membuat koleksi dari 410 folder yang hanya berisi materi yang akhirnya diedit - dengan tiff mendekati 4TB. Metode termudah yang ditemukan adalah menggunakan (di Micr
Jurie

Jawaban:

155

Jika direktori target kosong, gunakan temukan, filter dengan hanya direktori, filter berdasarkan nama, jalankan rmdir:

find . -type d -name a -exec rmdir {} \;

Jika Anda ingin menghapus isinya secara rekursif, ganti -exec rmdir {} \;dengan -deleteatau -prune -exec rm -rf {} \;. Jawaban lain termasuk perincian tentang versi-versi ini, beri penghargaan juga.

pistache
sumber
9
Bisakah Anda jelaskan apa {} \;fungsinya?
winklerrr
6
{}dapat dibaca sebagai "untuk setiap file / folder yang cocok" - yaitu itu menggantikan setiap file / folder "ditemukan". \;adalah terminator untuk -execklausa.
wmorrison365
2
Ini memberi saya kesalahan "tidak bisa menghapus" ketika direktori tidak kosong
blindeyes
1
Pertimbangkan untuk menambahkan -prunetanda pada jawaban sesuai saran @vid Grayson. Tanpa ini, findmasih akan mencoba untuk mengunjungi folder yang sekarang hilang dan akhirnya akan keluar dengan kode kesalahan, yang dapat misalnya gagal membangun Docker.
Czyzby
160

Gunakan find for name "a" dan jalankan rm untuk menghapus nama sesuai dengan keinginan Anda, sebagai berikut:

find . -name a -exec rm -rf {} \;

Uji terlebih dahulu menggunakan ls ke daftar:

find . -name a -exec ls {} \;

Untuk memastikan ini hanya menghapus direktori dan bukan file biasa, gunakan argumen "-type d" (seperti yang disarankan dalam komentar):

find . -name a -type d -exec rm -rf {} \;

"{}" Adalah substitusi untuk setiap file "a" ditemukan - perintah exec dijalankan terhadap masing-masing oleh substitusi.

wmorrison365
sumber
4
Anda mungkin ingin menambahkan "-type d" di sana hanya memetikan file yang cocok dengan nama yang sama.
Mark Loeser
3
Juga perhatikan bahwa ini akan menangkap sesuatu seperti 1/2/a/3/4, yang mungkin tidak dimaksudkan, jadi +1 untuk rekomendasi untuk menguji pertama ...
twalberg
9
reco echo {}untuk mengujinya terlebih dahulu, bukanls {}
Charney Kaye
2
Ini dia node_modules/.
saruftw
6
Saya menggunakan find . -name a -type d -exec rm -rf {} \;dan berhasil, meskipun dicetak find: ‘./subdir/subdir/a’: No such file or directoryuntuk setiap direktori dihapus.
Pacoverflow
59

Ini juga berfungsi - ini akan menghapus semua folder yang disebut "a" dan isinya:

rm -rf `find -type d -name a`
Arash Fotouhi
sumber
@Buffalo, bagaimana bisa? Defo Il ini berfungsi tetapi begitu juga yang lain. Akan terkejut menemukan lingkungan tempat ini bekerja tetapi yang lain tidak memberikan semua jawaban pada dasarnya find/rm.
wmorrison365
4
@ wmorrison365 karena jika Anda melakukannya find . -name a -exec rm -rf {} \;, find akan macet ketika mencoba masuk ke direktori itu untuk mencari lebih banyak item, membuat Anda seperti kesalahan find: '1/2/3/a': No such file or directory.
Alex Grönholm
@Alex Grönholm yakin, tetapi semua folder bernama 'a' tetap dihapus. Saat Anda menyatakan, temukan selanjutnya tidak bisa melihat ke dalam folder 'a' yang dihapus tetapi itu tidak masalah. Ingin menyimpan konten 'a' untuk diproses selanjutnya sebelum dihapus adalah kasus penggunaan yang berbeda dengan yang diminta OP.
wmorrison365
6
@ wmorrison365 Ya, direktori dihapus tapi saya rasa tidak baik untuk merekomendasikan solusi di mana perintah gagal (mengembalikan kode keluar bukan nol).
Alex Grönholm
1
Ini memberi saya kesalahan illegal option --t. Aku harus juga melewati direktori untuk mencari di ( stackoverflow.com/questions/25840713/... ): rm -rf `find . -type d -name a`.
Steve Harrison
25

Untuk menghapus semua direktori dengan nama foo, jalankan:

find -type d -name foo -a -prune -exec rm -rf {} \;

Jawaban lain tidak ada yang penting: -pruneopsi. Tanpa -prune, GNU find akan menghapus direktori dengan nama yang cocok dan kemudian mencoba untuk kembali ke dalamnya untuk menemukan lebih banyak direktori yang cocok. The -prunepilihan mengatakan itu untuk tidak recurse ke direktori yang cocok dengan kondisi.

David Grayson
sumber
21

Saya berakhir di sini mencari untuk menghapus node_modulesfolder saya sebelum melakukan cadangan pekerjaan saya sedang berlangsung menggunakan rsync. Persyaratan utama adalah bahwa node_modulesfolder dapat disarangkan, sehingga Anda memerlukan -pruneopsi.

Pertama saya menjalankan ini untuk memverifikasi secara visual folder yang akan dihapus:

find -type d -name node_modules -prune

Lalu saya menjalankan ini untuk menghapus semuanya:

find -type d -name node_modules -prune -exec rm -rf {} \;

Berkat pistache

mpalumbo7
sumber
Ahh itu bekerja dengan baik, untuk membuat ini sesuatu yang bisa Anda gunakan dengan mudah, Anda bisa menyimpan ini sebagai shellscript kecil: sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Feirell
11
find ./ -name "FOLDERNAME" | xargs rm -Rf

Sebaiknya lakukan triknya. PERINGATAN, jika Anda secara tidak sengaja memompa satu .atau /ke xargs rm -Rfseluruh komputer Anda akan dihapus tanpa opsi untuk mendapatkannya kembali, memerlukan OS instal ulang.

Slevin
sumber
2
Oh, risiko kecil itu. Apakah itu semuanya? Ha ha. Super terima kasih atas peringatannya. Saya pasti akan membuat kesalahan mengetik.
TinkerTenorSoftwareGuy
9

Saya punya lebih dari 100 file

log-12
log-123
log-34
....

jawaban di atas tidak berhasil untuk saya

tetapi perintah berikut membantu saya.

find . -name "log-*" -exec rm  -rf {} \;

saya memberi -typesebagai .sehingga menghapus kedua file dan folder yang dimulai denganlog-

dan rm -rfmenghapus folder secara rekursif walaupun memiliki file.

jika Anda ingin folder sendiri

find -type d -name "log-*" -exec rm  -rf {} \;

file sendiri

find -type f -name "log-*" -exec rm  -rf {} \;
Thamaraiselvam
sumber
8

Menggabungkan beberapa jawaban, inilah perintah yang berfungsi pada Linux dan MacOS

rm -rf $(find . -type d -name __pycache__)
marcosfede
sumber
Hanya satu yang bekerja untuk saya yang tidak juga membuat kesalahan
Kloar
7

Yang lainnya:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)
dgrigonis
sumber
3
Jawaban ini hanya berfungsi untuk folder kosong. -deletetidak menghapus folder yang tidak kosong.
maninak
Terima kasih telah menambahkan versi OSX
schu34
6

Perintah ini bekerja untuk saya. Itu melakukan pekerjaannya secara rekursif

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - folder saat ini

"node_modules" - nama folder

1 naluri
sumber
-2

temukan path / ke / folder / -maxdepth 1 -nama "my_ *" -type d -delete

PickleRick
sumber