Bagaimana cara membuat "menemukan" mengecualikan folder yang dicari?

18

Saya menjalankan perintah berikut:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

Saya ingin menghapus semua folder di bawah processingfolder (folder pemrosesan tidak boleh dihapus).

Perintah juga menghapus processingfolder. Bagaimana cara membatasi skrip untuk hanya menghapus folder di bawah folder itu?

Elad Dotan
sumber
1
anak cucu: stackoverflow.com/questions/13525004/…
Trevor Boyd Smith

Jawaban:

32

Cara termudah adalah dengan hanya menambahkan -mindepth 1, yang akan melewati hierarki kedalaman pertama dan meninggalkan direktori induk Anda.

Selain itu, Anda tidak perlu -execpanggilan tambahan rm, Anda dapat langsung deletemembuka folder jika kosong.

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

Jika tidak kosong:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

Jika Anda malas, Anda juga dapat memiliki wildcard diperluas. Karena *tidak memasukkan direktori saat ini secara default ( kecuali dotglobdiatur ), Anda juga dapat melakukan:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

Namun, ini juga tidak termasuk folder tersembunyi, lagi karena dotglobopsi.

slhck
sumber
Hai, saya mendapatkan "find: warning: Anda telah menentukan opsi -mintepth setelah argumen non-opsi -type, tetapi opsinya tidak posisional (-mindepth memengaruhi tes yang ditentukan sebelum serta yang ditentukan setelahnya). Silakan tentukan opsi sebelum argumen lain. "dan juga" menemukan: tidak dapat menghapus `/ folder / 50d82faf0e09e ': Direktori tidak kosong"
Elad Dotan
Tambahkan mindepth sebelum mengetik. Untuk menghapus direktori ketika tidak kosong, Anda dapat tetap menggunakan pendekatan rm yang Anda miliki semula.
slhck
4

Masalahnya adalah bahwa find mengembalikan direktori saat ini (.) Bersama dengan direktori lain, sehingga menghapus folder pemrosesan serta subdirektori. Cara cepat untuk menyiasatinya adalah dengan menambahkan opsi

-not -name .

yang berhenti menemukan dari keluaran direktori saat ini, dan pada gilirannya menghentikannya dari dihapus.

Itu akan berhasil jika Anda menjalankan perintah di dalam direktori pemrosesan, jadi untuk memungkinkan Anda menggunakan jalur absolut:

-not -name /var/www/html/content/processing

Dan seluruh perintahnya adalah:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;
Xenopathic
sumber
Perintah terakhir salah. -namemengacu pada nama dasar, itu tidak pernah cocok dengan slash. Anda mungkin perlu menggunakan -path.
Kamil Maciorowski
1

Sudah dijawab, masih saya ingin daftar pendekatan lain.

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

Ini akan mengecualikan direktori teratas (dan juga sub direktori), dan sekarang Anda dapat menerapkan perintah apa pun yang ingin kami terapkan di atasnya.

>> Opsi:
-mindepth 1: Untuk mengecualikan direktori root
-maxdepth 1: Untuk menghindari penguraian sub direktori. (Untuk skenario tertentu seperti yang dipertanyakan, Anda tidak memerlukan ini).
-type d: Daftar hanya jenis direktori. Pilihan ini harus datang setelah penggunaan maxdepth mindepth.

pemalu
sumber
Mengapa -maxdepth 1? Mengapa -type ddua kali? Apa bedanya dengan jawaban yang diterima?
Attie
@ Attie: Terima kasih, koreksi kesalahannya. maxdepth tidak diperlukan, tetapi akan berguna jika Anda ingin menghindari daftar sub-direktori.
prashant