Apakah ada cara mudah untuk menemukan semua file jarang di sistem saya, atau di pohon direktori tertentu?
Jika relevan, saya menggunakan zsh
Ubuntu 12.04, meskipun jawaban Unix-y yang lebih umum untuk bash / sh, misalnya, akan baik-baik saja.
Sunting : untuk memperjelas, saya mencari untuk mencari file yang jarang, tidak memeriksa status jarangnya dari satu file.
filesystems
files
Andrew Ferrier
sumber
sumber
Jawaban:
Pada sistem (dan sistem file) yang mendukung
SEEK_HOLE
lseek
flag (seperti Ubuntu 12.04 Anda pada ext4 akan) dan dengan asumsi nilaiSEEK_HOLE
adalah 4 seperti di Linux:Sintaks shell itu adalah POSIX. Hal-hal non-portabel di dalamnya adalah
perl
dan ituSEEK_HOLE
.lseek(SEEK_HOLE)
mencari ke awal lubang pertama di file, atau akhir file jika tidak ada lubang yang ditemukan. Di atas kita tahu file tidak jarang ketikalseek(SEEK_HOLE)
membawa kita ke akhir file (ke tempat yang sama denganlseek(SEEK_END)
).Jika Anda ingin membuat daftar file yang jarang:
GNU
find
(sejak versi 4.3.3) harus-printf %S
melaporkan jarangnya file. Dibutuhkan pendekatan yang sama dengan jawaban frostschutz karena dibutuhkan rasio penggunaan disk vs ukuran file, jadi tidak dijamin untuk melaporkan semua file jarang (seperti ketika ada kompresi pada tingkat filesystem atau di mana ruang yang disimpan oleh lubang tidak mengkompensasi overhead infrastruktur sistem file atau atribut diperluas besar), tetapi akan bekerja pada sistem yang tidak memilikiSEEK_HOLE
atau sistem file di manaSEEK_HOLE
tidak diimplementasikan. Di sini dengan alat GNU:(perhatikan bahwa versi sebelumnya dari jawaban ini tidak berfungsi dengan baik ketika
find
menyatakan sparseness seperti misalnya 3.2e-05. Terima kasih atas jawaban @ flashydave untuk membawanya ke perhatian saya)sumber
find
juga harus mengecualikan 0-byte-file sekaligus?find -printf '%S'
! :-)tr
perintah denganxargs -r0 rm -f
File biasanya jarang ketika jumlah blok yang dialokasikan lebih kecil dari ukuran file (di sini menggunakan GNU
stat
seperti yang ditemukan di Ubuntu, tetapi berhati-hatilah sistem lain mungkin memiliki implementasi yang tidak kompatibelstat
).Varian dengan
find
: (dicuri dari Stephane)Anda biasanya meletakkan ini dalam skrip shell, kemudian mengeksekusi skrip shell.
sumber
SEEK_HOLE
sama bermasalahnya, karena tidak didukung oleh banyak platform / sistem file. Di Linux Anda juga bisa menggunakanFIEMAP
/FIBMAP
, tetapiFIBMAP
khususnya sangat lambat ... sepertinya tidak ada cara yang baik.for file in *
ataufind
. Jika Anda dapat menguji satu file, Anda dapat menguji semua file ... walaupun Anda harus mengecualikan direktori dengan metode ini.Stephane Chazelas jawaban di atas tidak memperhitungkan fakta bahwa beberapa file jarang dengan parameter% S melaporkan rasio sebagai angka floating point seperti
Ini dapat ditemukan di samping dengan
sumber
Sebuah skrip pendek yang saya tulis ketika mencoba mencari tahu apa lokasi lubang dalam sebuah file:
Ini mencetak hal-hal seperti:
sumber