Mam skrypt, który sprawdza rozmiar 0, ale pomyślałem, że zamiast tego musi istnieć łatwiejszy sposób sprawdzania rozmiarów plików. To file.txt
znaczy normalnie 100k; jak sprawić, by skrypt sprawdził, czy jest mniejszy niż 90k (w tym 0), i sprawić, by wykonał nową kopię, ponieważ w tym przypadku plik jest uszkodzony.
Czego obecnie używam…
if [ -n file.txt ]
then
echo "everything is good"
else
mail -s "file.txt size is zero, please fix. " myemail@gmail.com < /dev/null
# Grab wget as a fallback
wget -c https://www.server.org/file.txt -P /root/tmp --output-document=/root/tmp/file.txt
mv -f /root/tmp/file.txt /var/www/file.txt
fi
Odpowiedzi:
[ -n file.txt ]
nie sprawdza swojego rozmiaru, sprawdza, czy łańcuchfile.txt
ma niezerową długość, więc zawsze się powiedzie.Jeśli chcesz powiedzieć „rozmiar jest niezerowy”, potrzebujesz
[ -s file.txt ]
.Aby uzyskać rozmiar pliku, możesz użyć,
wc -c
aby uzyskać rozmiar (długość pliku) w bajtach:W tym przypadku wygląda na to, że tego chcesz.
Ale do Twojej wiadomości, jeśli chcesz wiedzieć, ile miejsca na dysku zajmuje plik, możesz użyć
du -k
do uzyskania rozmiaru (zajętego miejsca na dysku) w kilobajtach:Jeśli potrzebujesz większej kontroli nad formatem wyjściowym, możesz również spojrzeć na
stat
. W Linuksie zacząłbyś od czegoś takiegostat -c '%s' file.txt
, a na BSD / Mac OS X, coś w stylustat -f '%z' file.txt
.źródło
du -b "$file" | cut -f 1
zamiaststat -c '%s' "$file"
? Albostat --printf="%s" "$file"
?stat
mają różne flagi.... | cut -d' ' -f1
, aby działał na Ubuntu.wc -c < "$file"
(zwróć uwagę na<
), w takim przypadku nie potrzebujesz| cut ...
części (która, jak napisano, nie działa na OSX). MinimalnaBLOCKSIZE
wartość dladu
w systemie OSX to512
.wc -c <filename
używa równieżfstat
iseek
? Zauważ, żefstat
pobiera fd, a nie ścieżkę.Zaskakuje mnie, że nikt nie wspomniał
stat
o sprawdzaniu rozmiaru pliku. Niektóre metody są zdecydowanie lepsze: użycie-s
do sprawdzenia, czy plik jest pusty, czy nie, jest łatwiejsze niż czegokolwiek innego, jeśli to wszystko, czego chcesz. A jeśli chcesz znaleźć pliki o dużym rozmiarze, zfind
pewnością jest to droga.Bardzo lubię
du
też uzyskiwać rozmiar pliku w kb, ale dla bajtów użyłbymstat
:źródło
stat
to świetny pomysł, ale na CentOS to właśnie zadziałało dla mnie:size=$(stat -c%s $filename)
stat
będąc tuż rzeczą w niektórych sytuacjach i rzadkie pliki nie są odpowiednie w większości sytuacji, choć na pewno nie wszystkie.alternatywne rozwiązanie z awk i podwójnym nawiasem:
źródło
du
nie obsługuje-b
. (Może to być świadomy wybór stylu, ale po prostu wspomnieć alternatywę: można pominąć$
wnętrze prefiksu(( ... ))
przy odwoływaniu zmienne:((SIZE<90000))
)$
awk
, używającread
(bash
polecenia wewnętrznego):read SIZE _ <<<$(du -sb "$FILENAME")
Jeśli Twoja
find
składnia obsługuje tę składnię, możesz jej użyć:Spowoduje to wyjście
file.txt
na stdout wtedy i tylko wtedy, gdy rozmiarfile.txt
jest mniejszy niż 90k. Aby wykonać skrypt,script
jeślifile.txt
ma rozmiar mniejszy niż 90 KB:źródło
find . -maxdepth 1 -name "file.txt" -size -90k
Jeśli szukasz tylko rozmiaru pliku:
źródło
wc -c "$file"
jako odpowiedź udzielono w 2011 r. (trzy lata temu). Tak,wc -c "$file"
ma problem polegający na tym, że wyświetla nazwę pliku, a także liczbę znaków, więc wczesne odpowiedzi dodały polecenie oddzielenia liczby. Ale towc -c < "$file"
, co rozwiązuje ten problem, zostało dodane jako komentarz w maju 2014 roku. Twoja odpowiedź jest równoważna z tym, że dodaje „bezużyteczne użyciecat
” . Powinieneś także cytować wszystkie odwołania do zmiennych powłoki, chyba że masz ku temu dobry powód.Działa to zarówno w systemie Linux, jak i macOS
źródło
stat wydaje się robić to z najmniejszą liczbą wywołań systemowych:
źródło
strace du --bytes $1 2>&1 >/dev/null | wc
Jeśli tak jest, to na architekturze amd64 na ArchLinux (zwykle najnowsze wersje wszystkiego) mam 45 linii dladu
, 46 linii dlastat
, 47 linii dlawc
i 72 linie dlafind
.przenośny, wszystkie odmiany Pythona, unika różnic w dialektach statystycznych
źródło
Aby uzyskać rozmiar pliku zarówno w systemie Linux, jak i Mac OS X (i prawdopodobnie w innych BSD), nie ma wielu opcji, a większość z sugerowanych tutaj będzie działać tylko na jednym systemie.
Biorąc pod uwagę
f=/path/to/your/file
,co działa w systemie Linux i Mac Bash:
lub
Pozostałe odpowiedzi działają dobrze w Linuksie, ale nie na Macu:
du
nie ma-b
opcji na Macu, a sztuczka BLOCKSIZE = 1 nie działa („minimalny rozmiar bloku to 512”, co prowadzi do nieprawidłowego wyniku)cut -d' ' -f1
nie działa, ponieważ na Macu liczba może być wyrównana do prawej i uzupełniona spacjami z przodu.Więc jeśli trzeba coś elastycznego, to albo
perl
jest-s
operator, lubwc -c
rurami doawk '{print $1}'
(awk ignoruje wiodącą spacje).Oczywiście, jeśli chodzi o resztę pierwotnego pytania, użyj operatora
-lt
(lub-gt
):if [ $size -lt $your_wanted_size ]; then
itp.źródło
size=$(wc -c < "$f")
(zwróć uwagę na<
, co powodujewc
zgłoszenie tylko liczby). Dla porównania: nie zapomnij o bardziej „bash-ful”if (( size < your_wanted_size )); then ...
(a także[[ $size -lt $your_wanted_size ]]
).Na podstawie odpowiedzi gniourf_gniourf,
zapisze
file.txt
na stdout wtedy i tylko wtedy, gdy rozmiarfile.txt
jest mniejszy niż 90K, awykona polecenie,
command
jeślifile.txt
ma rozmiar mniejszy niż 90 KB. Przetestowałem to w systemie Linux. Odfind(1)
,(podkreślenie dodane).
źródło
zakładając, że polecenie ls zgłasza rozmiar pliku w kolumnie # 6
źródło
Użyłbym
du
„s--threshold
do tego. Nie jestem pewien, czy ta opcja jest dostępna we wszystkich wersjach programu,du
ale została zaimplementowana w wersji GNU.Cytując z podręcznika du (1) :
Oto moje rozwiązanie, używając
du --threshold=
dla przypadku użycia OP:Zaletą tego jest to, że
du
można zaakceptować argument do tej opcji w znanym formacie - albo ludzkim, jak w10K
,10MiB
lub czymkolwiek czujesz się komfortowo - nie musisz ręcznie konwertować między formatami / jednostkami, ponieważdu
obsługuje to.Dla odniesienia, oto wyjaśnienie tego
SIZE
argumentu ze strony podręcznika:źródło
du
które go nie obsługują.--threshold
Opcja została dodana w coreutils 8.21, wydany w 2013 roku .Okay, jeśli korzystasz z komputera Mac, zrób to:
stat -f %z "/Users/Example/config.log"
to wszystko!źródło