Czy istnieje prosty sposób na znalezienie wszystkich rzadkich plików w moim systemie lub w określonym drzewie katalogów?
Jeśli ma to znaczenie, używam zsh
na Ubuntu 12.04, chociaż bardziej ogólna odpowiedź na Unix-y dla bash / sh, na przykład, byłaby w porządku.
Edycja : aby wyjaśnić, szukam rzadkich plików, a nie sprawdzam rzadkości statusu pojedynczego pliku.
filesystems
files
Andrew Ferrier
źródło
źródło
Odpowiedzi:
W systemach (i systemach plików) obsługujących
SEEK_HOLE
lseek
flagę (takich jak Ubuntu 12.04 na ext4) i przyjmujących, że wartośćSEEK_HOLE
wynosi 4 tak jak w Linuksie:Ta składnia powłoki to POSIX. Non-przenośny rzeczy są w niej
perl
i żeSEEK_HOLE
.lseek(SEEK_HOLE)
szuka początku pierwszego otworu w pliku lub końca pliku, jeśli nie znaleziono otworu. Powyżej wiemy, że plik nie jest rzadki, gdylseek(SEEK_HOLE)
przenosi nas na koniec pliku (w to samo miejsce, colseek(SEEK_END)
).Jeśli chcesz wyświetlić listę rzadkich plików:
GNU
find
(od wersji 4.3.3) musi-printf %S
zgłaszać rzadkość pliku. Przyjmuje to samo podejście, co odpowiedź frostschutza , ponieważ przyjmuje stosunek wykorzystania dysku do wielkości pliku, więc nie ma gwarancji zgłaszania wszystkich plików rzadkich (na przykład, gdy istnieje kompresja na poziomie systemu plików lub gdy miejsce zaoszczędzone przez dziury nie kompensować narzut infrastruktury infrastruktury plików lub duże rozszerzone atrybuty), ale działałby na systemach, które nie mająSEEK_HOLE
systemu plików lub na systemach, które nie sąSEEK_HOLE
zaimplementowane. Tutaj z narzędziami GNU:(zauważ, że wcześniejsza wersja tej odpowiedzi nie działała poprawnie po
find
wyrażeniu rzadkości, jak na przykład 3.2e-05. Dzięki odpowiedzi @ flashydave za zwrócenie jej uwagi)źródło
find
powinien również wykluczyć pliki 0-bajtowe?find -printf '%S'
! :-)tr
polecenie naxargs -r0 rm -f
Plik jest zwykle rzadki, gdy liczba przydzielonych bloków jest mniejsza niż rozmiar pliku (tutaj przy użyciu GNU takiego
stat
jak w Ubuntu, ale uważaj, inne systemy mogą mieć niezgodne implementacjestat
).Wariant z
find
: (skradziony ze Stephane)Zwykle umieszczasz to w skrypcie powłoki, a następnie uruchamiasz skrypt powłoki.
źródło
SEEK_HOLE
jest jednak równie problematyczny, ponieważ nie jest obsługiwany przez wiele platform / systemów plików. W Linuksie możesz także użyćFIEMAP
/FIBMAP
, aleFIBMAP
w szczególności jest on strasznie wolny ... po prostu nie wydaje się, aby był to dobry sposób.for file in *
lubfind
. Jeśli możesz przetestować pojedynczy plik, możesz przetestować wszystkie pliki ... chociaż musisz wykluczyć katalogi za pomocą tej metody.Odpowiedź Stephane'a Chazelasa powyżej nie bierze pod uwagę faktu, że niektóre rzadkie pliki z parametrem znajdź% S zgłaszają stosunek jako liczby zmiennoprzecinkowe, takie jak
Można je znaleźć dodatkowo z
źródło
Krótki skrypt, który napisałem, próbując dowiedzieć się, jakie są lokalizacje dziur w pliku:
To drukuje takie rzeczy jak:
źródło