Script Bash untuk menghapus file yang lebih lama dari x hari dengan subdirektori
37
Saya mencoba menghapus satu ton file yang lebih lama dari x hari.
Sekarang saya memiliki skrip untuk melakukan itu
find /path/to/files* -mtime +10 -exec rm {} \;
Tetapi ini juga akan menghapus subdirektori. Ada banyak folder tetapi saya ingin menyimpannya, dan menghapus file yang lebih lama dari 10 hari di dalam folder tersebut.
findmenerima typeopsi untuk memilih, misalnya, hanya file.
find /path/to/files -type f -mtime +10 -delete
Biarkan -deleteuntuk menunjukkan apa yang akan dihapus, dan setelah Anda memverifikasi itu, silakan dan jalankan perintah lengkap.
Itu hanya akan berjalan pada file, bukan direktori. Gunakan -type duntuk direktori invers, hanya daftar yang cocok dengan argumen Anda.
Opsi tambahan
Anda mungkin ingin membaca man find, karena ada beberapa opsi lain yang mungkin Anda butuhkan di masa depan. Sebagai contoh, -maxdepthakan memungkinkan Anda untuk hanya membatasi barang yang ditemukan ke kedalaman tertentu, misalnya -maxdepth 0tidak akan muncul kembali ke subdirektori.
Beberapa komentar
Saya bertanya-tanya bagaimana perintah akan menghapus folder, karena Anda tidak dapat menghapus folder rmhanya dengan . Anda akan membutuhkannya rm -r.
Juga /path/to/files*membingungkan. Apakah maksud Anda /path/to/files/atau Anda mengharapkan wildcard meluas ke beberapa nama file dan folder?
Masukkan {}tanda kutip tunggal, yaitu '{}'untuk menghindari nama file / direktori yang diganti ditafsirkan oleh shell, sama seperti kita melindungi tanda titik koma dengan backslash.
Yah ada banyak folder di dalam / path / ke / file / sebenarnya saya ingin menjalankan mtime +10 -exec rm ke masing-masing folder tetapi menyimpan folder itu sendiri, pada dasarnya yang ingin saya capai adalah menghapus semua file lebih lama dari 10 hari dan simpan semua folder. Saya seorang pemula, tetapi tentang pemula itu :)
JoyIan Yee-Hernandez
Nah, begini :) Lakukan saja find /path/to/files* -type f -mtime +10dan lihat apa hasilnya.
slhck
Yup, ketika ragu, jangan lakukan -exec, lihat saja apa yang ditemukannya terlebih dahulu.
Rob
2
@ JoyIanYee-Hernandez Anda juga dapat menggunakan -deleteargumen untuk find, yang menghapus semua file dan folder, yang terakhir hanya jika kosong. Ini menyiratkan -depth, yaitu pencarian mendalam-pertama.
Daniel Beck
1
@ Kreker Kemudian Anda perlu menambahkan -mindepth 1untuk mengecualikan direktori induk.
slhck
5
Seperti pada jawaban sebelumnya (+1 untuk keduanya) triknya adalah menggunakan -type fpredikat.
Perhatikan, bahwa alih-alih -exec rm '{}'Anda juga bisa menggunakan -deletepredikat. Tapi jangan lakukan itu. Dengan -exec rm '{}'Anda dapat (dan harus) terlebih dahulu lakukan -exec echo rm '{}'untuk memverifikasi bahwa ini benar-benar yang Anda inginkan. Setelah itu jalankan kembali perintah tanpa echo.
Menggunakan -deletelebih cepat (tidak ada tambahan fork()dan execve()untuk setiap file), tetapi ini berisiko karena -deleteberfungsi juga sebagai syarat, jadi:
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
Untuk mempercepat, gunakan perintah '+'alih-alih\;
find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'
Ini akan berjalan rmhanya sekali di akhir daripada setiap kali file ditemukan.
( rmdapat dijalankan beberapa kali jika Anda benar-benar memiliki banyak file karena batasan panjang baris perintah, tetapi ini masih hampir secepat menggunakan -delete)
find /path/to/files* -type f -mtime +10
dan lihat apa hasilnya.-exec
, lihat saja apa yang ditemukannya terlebih dahulu.-delete
argumen untukfind
, yang menghapus semua file dan folder, yang terakhir hanya jika kosong. Ini menyiratkan-depth
, yaitu pencarian mendalam-pertama.-mindepth 1
untuk mengecualikan direktori induk.Seperti pada jawaban sebelumnya (+1 untuk keduanya) triknya adalah menggunakan
-type f
predikat.Perhatikan, bahwa alih-alih
-exec rm '{}'
Anda juga bisa menggunakan-delete
predikat. Tapi jangan lakukan itu. Dengan-exec rm '{}'
Anda dapat (dan harus) terlebih dahulu lakukan-exec echo rm '{}'
untuk memverifikasi bahwa ini benar-benar yang Anda inginkan. Setelah itu jalankan kembali perintah tanpaecho
.Menggunakan
-delete
lebih cepat (tidak ada tambahanfork()
danexecve()
untuk setiap file), tetapi ini berisiko karena-delete
berfungsi juga sebagai syarat, jadi:tetapi jika Anda HANYA bertukar argumen:
Jika Anda perlu
find
danrm
bekerja lebih cepat untuk banyak file, lihatfind ... | xargs ... rm
idiom UNIX.sumber
Anda dapat dengan mudah melakukan ini dengan perintah find
Yang membatasi hasil dari jenis file
sumber
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
Untuk mempercepat, gunakan perintah
'+'
alih-alih\;
Ini akan berjalan
rm
hanya sekali di akhir daripada setiap kali file ditemukan.(
rm
dapat dijalankan beberapa kali jika Anda benar-benar memiliki banyak file karena batasan panjang baris perintah, tetapi ini masih hampir secepat menggunakan-delete
)sumber
rm -f
find /path/to/files -type file -mtime -5
Ini akan menghapus file yang diubah dalam 5 hari
rm -f
find /path/to/files -type file -mtime +5
Ini akan menghapus file yang dimodifikasi sebelum 5 hari
Gunakan `sebelum menemukan dan pada akhirnya setelah 5.
sumber