Untuk mereka telanjang hubungan pada waktu penciptaan / modifikasi yang sebenarnya? Karena findbisa melakukannya tanpa melihat nama itu ...
Wrikken
mereka juga harus memiliki waktu kreasi / modifikasi
bobsr
4
Apa yang Anda maksud dengan "lebih tua dari"? Apakah Anda mengacu pada waktu direktori itu dibuat, waktu isinya terakhir diubah, atau sesuatu yang lain? Hati-hati dengan beberapa jawaban di bawah ini; ctimeadalah waktu perubahan inode. Untuk direktori, itu berubah ketika file ditambahkan atau dihapus dari direktori.
ajk
Jawaban:
390
Ini akan melakukannya secara rekursif untuk Anda:
find /path/to/base/dir/*-type d -ctime +10-exec rm -rf {} \;
Penjelasan:
find: perintah unix untuk mencari file / direktori / tautan dll.
/path/to/base/dir: direktori untuk memulai pencarian Anda.
-type d: hanya menemukan direktori
-ctime +10: hanya pertimbangkan yang modifikasi waktu lebih dari 10 hari
-exec ... \;: untuk setiap hasil yang ditemukan, lakukan perintah berikut di ...
rm -rf {}: secara rekursif menghapus direktori; yang {}bagian mana hasil find akan diganti menjadi dari bagian sebelumnya.
Atau, gunakan:
find /path/to/base/dir/*-type d -ctime +10| xargs rm -rf
Yang sedikit lebih efisien, karena berjumlah:
rm -rf dir1 dir2 dir3 ...
sebagai lawan:
rm -rf dir1; rm -rf dir2; rm -rf dir3;...
seperti pada -execmetode.
Dengan versi modern find, Anda dapat mengganti ;dengan +dan itu akan melakukan yang setara dengan xargspanggilan untuk Anda, meneruskan file sebanyak yang sesuai pada setiap panggilan sistem exec:
-mtimelebih baik bagi saya karena memeriksa perubahan konten daripada perubahan izin, jika tidak, ini sempurna.
quickshiftin pada
7
saya pikir ini juga akan menghapus dir base itu sendiri
Atau Gal
3
@ OrGal Anda benar-benar benar. Untuk mencegah ini, hanya menggunakan: find /path/to/base/dir/*.
zloynemec
11
Anda dapat menggunakan -maxdepth 1 untuk mengabaikan isi direktori
Sam
7
Pendekatan yang lebih efisien dapat menjadi bumerang jika Anda memiliki terlalu banyak folder untuk dihapus: stackoverflow.com/questions/11289551/… . Untuk alasan yang sama, untuk menghindari penghapusan folder dasar lebih baik digunakan -mindepth 1(daripada /path/to/folder/*).
Ohad Schneider
41
Jika Anda ingin menghapus semua subdirektori di bawah /path/to/base, misalnya
tetapi Anda tidak ingin menghapus root /path/to/base, Anda harus menambahkan -mindepth 1dan -maxdepth 1opsi, yang akan mengakses hanya subdirektori di bawah/path/to/base
-maxdepth 1akan HANYA mencocokkan subdirektori langsung di bawah /path/to/baseseperti /path/to/base/dir1, /path/to/base/dir2dan /path/to/base/dir3tetapi tidak akan mendaftar subdirektori ini secara rekursif. Jadi, subdirektori contoh ini tidak akan dicantumkan:
Saya pikir ada menangkap bahwa file harus lebih dari 10 hari juga. Belum mencoba, seseorang dapat mengonfirmasi dalam komentar.
Solusi yang paling banyak dipilih di sini tidak ada -maxdepth 0sehingga akan memanggil rm -rfuntuk setiap subdirektori, setelah menghapusnya. Itu tidak masuk akal, jadi saya sarankan:
find /base/dir/*-maxdepth 0-type d -ctime +10-exec rm -rf {} \;
The -deletesolusi di atas tidak menggunakan -maxdepth 0karena findakan mengeluh dir tidak kosong. Sebaliknya, ini menyiratkan -depthdan menghapus dari bawah ke atas.
Saya dapat mengkonfirmasi -deletepekerjaan, tetapi seperti yang Anda katakan, Anda hanya dapat menggunakannya untuk menghapus direktori kosong, seperti rmdir.
CTodea
3
Saya berjuang untuk memperbaiki ini menggunakan skrip yang disediakan di atas dan beberapa skrip lainnya terutama ketika file dan nama folder memiliki baris atau spasi baru.
Akhirnya menemukan tmpreaper dan telah bekerja dengan baik untuk kami sejauh ini.
Memiliki fitur seperti tes, yang memeriksa direktori secara rekursif dan daftar mereka. Kemampuan untuk menghapus symlink, file atau direktori dan juga mode perlindungan untuk pola tertentu saat menghapus
find
bisa melakukannya tanpa melihat nama itu ...ctime
adalah waktu perubahan inode. Untuk direktori, itu berubah ketika file ditambahkan atau dihapus dari direktori.Jawaban:
Ini akan melakukannya secara rekursif untuk Anda:
Penjelasan:
find
: perintah unix untuk mencari file / direktori / tautan dll./path/to/base/dir
: direktori untuk memulai pencarian Anda.-type d
: hanya menemukan direktori-ctime +10
: hanya pertimbangkan yang modifikasi waktu lebih dari 10 hari-exec ... \;
: untuk setiap hasil yang ditemukan, lakukan perintah berikut di...
rm -rf {}
: secara rekursif menghapus direktori; yang{}
bagian mana hasil find akan diganti menjadi dari bagian sebelumnya.Atau, gunakan:
Yang sedikit lebih efisien, karena berjumlah:
sebagai lawan:
seperti pada
-exec
metode.Dengan versi modern
find
, Anda dapat mengganti;
dengan+
dan itu akan melakukan yang setara denganxargs
panggilan untuk Anda, meneruskan file sebanyak yang sesuai pada setiap panggilan sistem exec:sumber
-mtime
lebih baik bagi saya karena memeriksa perubahan konten daripada perubahan izin, jika tidak, ini sempurna.find /path/to/base/dir/*
.-mindepth 1
(daripada/path/to/folder/*
).Jika Anda ingin menghapus semua subdirektori di bawah
/path/to/base
, misalnyatetapi Anda tidak ingin menghapus root
/path/to/base
, Anda harus menambahkan-mindepth 1
dan-maxdepth 1
opsi, yang akan mengakses hanya subdirektori di bawah/path/to/base
-mindepth 1
mengecualikan root/path/to/base
dari pertandingan.-maxdepth 1
akan HANYA mencocokkan subdirektori langsung di bawah/path/to/base
seperti/path/to/base/dir1
,/path/to/base/dir2
dan/path/to/base/dir3
tetapi tidak akan mendaftar subdirektori ini secara rekursif. Jadi, subdirektori contoh ini tidak akan dicantumkan:Dan seterusnya.
Jadi, untuk menghapus semua sub-direktori
/path/to/base
yang lebih dari 10 hari;sumber
find
mendukung-delete
operasi, jadi:Saya pikir ada menangkap bahwa file harus lebih dari 10 hari juga. Belum mencoba, seseorang dapat mengonfirmasi dalam komentar.
Solusi yang paling banyak dipilih di sini tidak ada
-maxdepth 0
sehingga akan memanggilrm -rf
untuk setiap subdirektori, setelah menghapusnya. Itu tidak masuk akal, jadi saya sarankan:The
-delete
solusi di atas tidak menggunakan-maxdepth 0
karenafind
akan mengeluh dir tidak kosong. Sebaliknya, ini menyiratkan-depth
dan menghapus dari bawah ke atas.sumber
-delete
pekerjaan, tetapi seperti yang Anda katakan, Anda hanya dapat menggunakannya untuk menghapus direktori kosong, sepertirmdir
.Saya berjuang untuk memperbaiki ini menggunakan skrip yang disediakan di atas dan beberapa skrip lainnya terutama ketika file dan nama folder memiliki baris atau spasi baru.
Akhirnya menemukan tmpreaper dan telah bekerja dengan baik untuk kami sejauh ini.
Tautan Sumber asli
Memiliki fitur seperti tes, yang memeriksa direktori secara rekursif dan daftar mereka. Kemampuan untuk menghapus symlink, file atau direktori dan juga mode perlindungan untuk pola tertentu saat menghapus
sumber
ATAU
Versi yang diperbarui dan lebih cepat:
sumber
xargs --show-limits
.-print0
/-0
merawat karakter shell khusus, atau tidak?xargs
versi akan @mpen, tetapi baris pertama tidak akan.