Perhatikan bahwa ini akan secara rekursif turun ke subdirektori, dan tanpa syarat akan menghapus semua file yang lebih kecil dari 1 megabyte. Hati-hati.
@DanielAndersson: findmembatasi jumlah argumen untuk proses yang dipanggil agar sesuai dengan batas-batas sistem, berbeda dengan rm *, yang dijamin menjadi pemanggilan proses tunggal. findakan memanggil beberapa instance rmjika perlu. Dan saya cukup yakin bahwa karakter khusus diperlakukan dengan benar, termasuk karakter baris baru. Saya lebih suka -exec rmlebih -deletekarena alasan fleksibilitas - sebagai contoh, penawaran terakhir ada cara untuk menghapus write-file yang dilindungi.
Sven Marnach
1
@Invoker: Saya mengembalikan perubahan Anda karena itu salah. -1Mberarti kurang dari satu megabyte yang diinginkan. Versi Anda akan menghapus semua file dengan ukuran tepat satu megabyte, yang tampaknya merupakan operasi yang tidak berguna.
Sven Marnach
2
Bagi siapa pun yang tertarik, jika Anda ingin menghapus semua file lebih besar dari 1M, gunakan perintah find . -type f -size +1M -exec rm {} +. Perhatikan +1M bukan -1M.
Saya tidak berpikir kita perlu tanda hubung dari dari 1M.
Invoker
2
@ Invoker, saya percaya -tandanya adalah tanda minus yang berarti "kurang dari 1 juta". Jika Anda menjalankan, find <directory> -type f -size +1M -deleteAnda akan menghapus semua file yang lebih besar dari 1M.
chessofnerd
ya kamu benar
salahku
2
Hanya untuk variasi dan kemungkinan peningkatan kinerja (mungkin marginal):
find <directory>-type f -size -1M-print0 | xargs -0 rm
Bagaimana ini seharusnya lebih cepat? Ini memulai xargsproses tambahan .
Sven Marnach
Sekarang Anda dapat memiliki dua CPU yang bersaing untuk perangkat blok yang sama! Lebih masuk akal, operasi stat / readdir tidak diblokir secara sinkron oleh operasi pembatalan tautan. Apakah ini cenderung lebih baik jelas tergantung pada ukuran subtree, jumlah file, perangkat dll.
Jawaban pada SO harus lengkap - jangan memposting tautan belaka. (Selain itu, kode dalam posting yang ditautkan menghapus file kosong daripada file yang lebih kecil dari 1M.)
Sven Marnach
@SvenMarnach tidak bisakah kita menggunakan $ file_size <1M dalam tautan contoh kode yang diberikan.
Tidak, kami tidak bisa, karena shell tidak akan mengerti 1M.
Sven Marnach
Dengan 1M saya maksudkan 1048576 mengkonversi 1MB ke byte
1
Nah, jika Anda menguji apakah ini benar-benar berfungsi dan menyalin kode ke jawaban Anda, ini mungkin menjadi jawaban SO.
Jawaban:
Ini dapat dilakukan dengan
find
:Perhatikan bahwa ini akan secara rekursif turun ke subdirektori, dan tanpa syarat akan menghapus semua file yang lebih kecil dari 1 megabyte. Hati-hati.
sumber
find
find
. :)find
membatasi jumlah argumen untuk proses yang dipanggil agar sesuai dengan batas-batas sistem, berbeda denganrm *
, yang dijamin menjadi pemanggilan proses tunggal.find
akan memanggil beberapa instancerm
jika perlu. Dan saya cukup yakin bahwa karakter khusus diperlakukan dengan benar, termasuk karakter baris baru. Saya lebih suka-exec rm
lebih-delete
karena alasan fleksibilitas - sebagai contoh, penawaran terakhir ada cara untuk menghapus write-file yang dilindungi.-1M
berarti kurang dari satu megabyte yang diinginkan. Versi Anda akan menghapus semua file dengan ukuran tepat satu megabyte, yang tampaknya merupakan operasi yang tidak berguna.find . -type f -size +1M -exec rm {} +
. Perhatikan +1M bukan -1M.Ini harus melakukan pekerjaan:
sumber
-
tandanya adalah tanda minus yang berarti "kurang dari 1 juta". Jika Anda menjalankan,find <directory> -type f -size +1M -delete
Anda akan menghapus semua file yang lebih besar dari 1M.Hanya untuk variasi dan kemungkinan peningkatan kinerja (mungkin marginal):
sumber
xargs
proses tambahan .Mencoba
sumber
\;
di akhir alih-alih+
Anda dapat checkout tautan ini http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , ia memiliki apa yang Anda inginkan.
Anda dapat mengulangi semua file dengan for for dan kemudian gunakan du dan awk untuk menemukan ukuran file seperti pada contoh di atas.
sumber
1M
.