Muszę znaleźć największe pliki w folderze.
Jak skanować folder rekurencyjnie i sortować zawartość według rozmiaru?
Próbowałem użyć ls -R -S
, ale zawiera również katalogi.
Próbowałem też użyć find
.
Muszę znaleźć największe pliki w folderze.
Jak skanować folder rekurencyjnie i sortować zawartość według rozmiaru?
Próbowałem użyć ls -R -S
, ale zawiera również katalogi.
Próbowałem też użyć find
.
Odpowiedzi:
Możesz to również zrobić za pomocą just du
. Dla pewności korzystam z tej wersji du
:
$ du --version
du (GNU coreutils) 8.5
Podejście:
$ du -ah ..DIR.. | grep -v "/$" | sort -rh
Polecenie du -ah DIR
wyświetli listę wszystkich plików i katalogów w danym katalogu DIR
. -h
Będzie produkować ludzkie rozmiary czytelne które wolę. Jeśli nie chcesz ich, upuść ten przełącznik. Używam head -6
tylko, aby ograniczyć ilość danych wyjściowych!
$ du -ah ~/Downloads/ | head -6
4.4M /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M /home/saml/Downloads/kodak_W820_wireless_frame
8.0K /home/saml/Downloads/bugs.xls
604K /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf
Łatwo posortować od najmniejszej do największej:
$ du -ah ~/Downloads/ | sort -h | head -6
0 /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock
Odwróć, od największego do najmniejszego:
$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G /home/saml/Downloads/digital_blasphemy
Nie pokazuj mi katalogu, tylko pliki:
$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G /home/saml/Downloads/digital_blasphemy
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
Jeśli chcesz tylko listę od najmniejszych do największych, ale 6 najczęściej obrażających się plików, możesz odwrócić przełącznik sortowania, drop ( -r
) i użyć tail -6
zamiast head -6
.
$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G /home/saml/Downloads/digital_blasphemy
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G /home/saml/Downloads/apps_archive
3.8G /home/saml/Downloads/audible
3.8G /home/saml/Downloads/audible/audio_books
grep -v "/$"
część wydaje się nie działać zgodnie z oczekiwaniami, ponieważ do katalogów nie dołączono ukośnika. Czy ktoś wie, jak wykluczyć katalogi z wyników?
/
- na przykład /home/saml/Downloads/audible
wydaje się być katalogiem, ale nie ma ukośnika. Tylko /home/saml/Downloads/
ma ukośnik, ale to prawdopodobnie dlatego, że napisał go z kreską przy określaniu argument początkowy du
.
Jeśli chcesz znaleźć wszystkie pliki w bieżącym katalogu i jego podkatalogach i wyświetlić je zgodnie z ich rozmiarem (bez uwzględnienia ich ścieżki) i zakładając, że żadna z nazw plików nie zawiera znaków nowej linii, w GNU find
możesz to zrobić:
find . -type f -printf "%s\t%p\n" | sort -n
Z man find
systemu GNU:
-printf format
True; print format on the standard output,
interpreting `\' escapes and `%' directives.
Field widths and precisions can be specified
as with the `printf' C function. Please note
that many of the fields are printed as %s
rather than %d, and this may mean that flags
don't work as you might expect. This also
means that the `-' flag does work (it forces
fields to be left-aligned). Unlike -print,
-printf does not add a newline at the end of
the string. The escapes and directives are:
%p File's name.
%s File's size in bytes.
Od man sort
:
-n, --numeric-sort
compare according to string numerical value
Spróbuj wykonać następujące polecenie:
ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20
Rekurencyjnie wyświetli listę 20 największych plików w bieżącym katalogu.
Uwaga: Opcja -h
dla sort
nie jest dostępna w OSX / BSD, więc musisz zainstalować sort
z coreutils
(np. Przez brew
) i zastosować lokalną ścieżkę bin PATH
, np.
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
Alternatywnie użyj:
ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20
Do największych katalogów użyj du
np .:
du -ah . | sort -rh | head -20
lub:
du -a . | sort -rn | head -20
Spowoduje to znalezienie rekursywnie wszystkich plików i posortowanie ich według rozmiaru. Drukuje wszystkie rozmiary plików w KB i zaokrągla w dół, więc możesz zobaczyć 0 KB plików, ale było wystarczająco blisko dla moich zastosowań i działa na OSX.
find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1
find . -type f
znajduje pliki ... działa rekurencyjnie, masz rację, ale wyświetla wszystkie znalezione pliki, a nie same katalogi
Dzięki zsh
znajdziesz największy plik (pod względem pozornego rozmiaru, takiego jak kolumna rozmiaru na ls -l
wyjściu, a nie użycie dysku) z:
ls -ld -- **/*(DOL[1])
Dla 6 największych:
ls -ld -- **/*(DOL[1,6])
Aby rozwiązać te o rozmiarze pliku, można użyć ls
„s -S
opcję. Niektóre ls
implementacje mają również -U
opcję ls
nie sortowania listy (ponieważ jest ona tutaj sortowana według rozmiaru zsh
).
Jest to niezwykle powszechna potrzeba z różnych powodów (lubię znaleźć najnowszą kopię zapasową w katalogu) i jest zaskakująco prostym zadaniem.
Zamierzam dostarczyć rozwiązanie dla Linuksa, które korzysta z narzędzi find, xargs, stat, tail, awk i sortowania.
Większość ludzi udzieliła kilku unikalnych odpowiedzi, ale ja wolę mój, ponieważ poprawnie obsługuje nazwy plików, a przypadek użycia można łatwo zmienić (modyfikować statystyki i sortować argumenty)
Zapewnię również rozwiązanie Python, które powinno umożliwiać korzystanie z tej funkcji nawet w systemie Windows
find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n
# Each utility is split on a new line to help
# visualize the concept of transforming our data in a stream
find . -type f -print0 |
xargs -0 -I{} stat -c '%s %n' {} |
sort -n |
tail -n 1 |
awk '{print $2}'
# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} |
sort -n | tail -n 1 | awk '{print $2}'
Wyjaśnienie:
#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
for filename in filenames:
realpath = os.path.join(dirpath, filename)
files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)
Wyjaśnienie tego skryptu trwa nieco dłużej, ale w zasadzie jeśli zapiszesz go jako skrypt, przeszuka on pierwszy argument podany w wierszu poleceń i zwróci największy plik w tym katalogu. Skrypt nie sprawdza błędów, ale powinien dać ci wyobrażenie, jak podejść do tego w Pythonie, co daje niezłą platformę niezależną od rozwiązania tego problemu.
Wariant tej odpowiedzi na podobne pytanie
find . -type f -exec du -ah {} + | sort -rh | more
Wypróbuj poniższe polecenie z opcją sortowania, aby mieć foldery o rozmiarze w porządku rosnącym
du -sh * | sort -sh