Temukan dan hapus semua direktori bernama "test" di linux

35

Saya memiliki banyak direktori bernama "test" dan saya ingin menghapusnya.

Saya tahu cara menemukannya dan mencetaknya menggunakan:

find . -name test -print

Sekarang, bagaimana cara saya menghapus direktori?


Harap dicatat bahwa saya memiliki file di direktori juga dan mereka harus dihapus juga.

pengumpulan sampah
sumber

Jawaban:

70

xargs melakukan semua keajaiban:

find . -name test -type d -print0|xargs -0 rm -r --

xargs mengeksekusi perintah yang dikirimkan sebagai parameter, dengan argumen diteruskan ke stdin.

Ini digunakan rm -runtuk menghapus direktori dan semua anak-anaknya.

Yang --menunjukkan akhir dari argumen, untuk menghindari jalan yang dimulai dengan -diperlakukan sebagai argumen.

-print0memberitahu finduntuk mencetak \0karakter, bukan baris baru; dan -0memberitahu xargsuntuk memperlakukan hanya \0sebagai pemisah argumen.

Ini memanggil rmdengan banyak direktori sekaligus, menghindari overhead panggilan rmsecara terpisah untuk setiap direktori.


Sebagai alternatif, findjuga dapat menjalankan perintah untuk setiap file yang dipilih :

find . -name test -type d -exec rm -r {} \;

Dan yang satu ini, dengan kinerja yang lebih baik, karena akan memanggil rmdengan beberapa direktori sekaligus :

find . -name test -type d -exec rm -r {} +

(Perhatikan bagian +akhir; yang ini setara dengan xargssolusinya.)

Arnaud Le Blanc
sumber
1
Jawaban yang sangat baik, terutama yang +ditemukan. Saya tidak tahu, pasti berharap saya sudah tahu itu sejak lama.
Scott
hati-hati dengan perintah terakhir, entah bagaimana menghapus beberapa file. yang xargsperintah bekerja dengan baik.
Henrique de Sousa
23
find /path/to/dir -name "test" -type d -delete
  • -nama: mencari nama yang diteruskan. Anda dapat menggunakan -regexuntuk memberikan nama berdasarkan ekspresi reguler

  • -mengetik: mencari jenis file. dhanya mencari direktori

  • -menghapus: tindakan yang menghapus daftar yang ditemukan.

Kalau tidak:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

Sebagai JF Sebastian dalam komentar:

Anda dapat menggunakan +alih-alih \;melewati lebih dari satu direktori pada suatu waktu.

jaypal singh
sumber
1
Maaf, saya lupa menyebutkan bahwa direktori ini mungkin memiliki file. Saya tidak dapat menghapus beberapa dari mereka karena kesalahan "temukan: tidak bisa menghapus` ./start ': Directory not empty "
pengumpulan sampah
@garbagecollection Saya menambahkan pembaruan.
jaypal singh
3
Anda bisa menggunakan +alih-alih \;melewati lebih dari satu direktori pada suatu waktu.
jfs
Terima kasih @ JSFSebastian Poin bagus. Saya akan menambahkannya ke jawabannya.
jaypal singh
5

Anda juga dapat menggunakan opsi -exec

find . -name test -exec rm {} \;
sethi
sumber
3

Dengan asumsi bash 4+

shopt -s globstar
rm -r ./**/test/

Garis miring berarti bahwa itu hanya akan cocok dengan direktori. Tes sebelumnya dengan:

printf '%s\n' ./**/test/
Evilsoup
sumber
2

Asumsikan Anda menggunakan gnu find , Anda dapat menggunakan opsi -delete:

find . -name test -delete

yang lebih mudah diingat.

Chun Yang
sumber
2

Ketika jawaban lain menunjukkan, Anda dapat mencoba menemukan semua direktori dengan nama testdan menghapusnya

find -name "test" -type d -delete

Saya mengalami beberapa masalah dengan kompatibilitas silang pada Mac, jadi saya menggunakan perintah yang setara ini:

find -path "*/test" -type d -delete
  • -jalan : mencari pola dalam nama file yang memenuhi syarat.

Namun dalam kedua kasus, jika ada direktori yang bernama test memiliki file di dalamnya,find akan mengeluh bahwa Directory is not empty, dan akan gagal menghapus direktori.

Jika Anda bermaksud menghapus semua file termasuktest direktori, maka kita dapat menggunakan trik yang sama untuk menghapus semua file di dalam direktori yang bernama testterlebih dahulu.

find -path "*/test/*" -delete

Pola:, "*/test/*"akan memastikan kami hanya menghapus file di dalam direktori yang bernama /test/. Setelah direktori kosong, kita dapat melanjutkan dan menghapus direktori menggunakan perintah pertama:

find -path "*/test" -type d -delete

Contoh:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

2 directories, 1 file
Karl
sumber