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.

Apakah ada cara untuk melakukan ini?

JoyIan Yee-Hernandez
sumber

Jawaban:

50

type opsi untuk memfilter hasil

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.

slhck
sumber
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:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

tetapi jika Anda HANYA bertukar argumen:

# delete ALL files
find . -type f -name '*.tmp' -delete

Jika Anda perlu finddan rmbekerja lebih cepat untuk banyak file, lihat find ... | xargs ... rmidiom UNIX.

Michał Šrajer
sumber
4
Saya pikir dua contoh terakhir Anda persis sama, mungkin ingin memperbaikinya!
slhck
1

Anda dapat dengan mudah melakukan ini dengan perintah find

$ find -type f

Yang membatasi hasil dari jenis file

Bernhard
sumber
1

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.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

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

pengguna52573
sumber
0

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)

olibre
sumber
0

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.

Nikhil Shinde
sumber