Jak mogę uzyskać rozmiar pliku w skrypcie bash?

Jak mogę sprawdzić rozmiar pliku w skrypcie bash?

Jak przypisać to do zmiennej bash, aby móc jej później użyć?

Komentarze

  • stackoverflow.com/questions/5920333/how-to-check-size-of-a-file LOL dla migracji 🙂
  • Połącz to z pv i cat dla polecenia kopiowania, które pokazuje postęp i szacowany czas przybycia 🙂
  • stat -c% s plik. nazwa
  • W przypadku (bardzo wąskiego) problemu XY, jest to fajne: jeśli wszystko, czego potrzebujesz, to przetestować plik ma niezerowy rozmiar, bash ma wyrażenie warunkowe -s, więc możesz po prostu sprawdzić, czy plik ma niezerową długość za pomocą if [ -s file ]; then echo "file has nonzero size" ; fi

Odpowiedź

Najlepiej, jeśli korzystasz z systemu GNU:

stat --printf="%s" file.any 

From man stat :

Łączny rozmiar% s, w bajtach

W skrypcie bash:

#!/bin/bash FILENAME=/home/heiko/dummy/packages.txt FILESIZE=$(stat -c%s "$FILENAME") echo "Size of $FILENAME = $FILESIZE bytes." 

UWAGA: patrz

@chbrown „odpowiedź na temat używania statystyki w terminalu w systemie Mac OS X.

Komentarze

  • @ haunted85 stat to najprostszy sposób, zakładając, że ' ponownie używasz Linuksa lub Cygwin (stat nie jest ' t standardowym). wc -c jako sugerowane przez Euga é ne jest przenośne.
  • stat: illegal option -- c
  • stat --printf="%s" file.txt nie ' t wypisz cokolwiek na Debianie Jessie …
  • Na MacOS to działa: stat -f%z myfile.tar
  • @woohoo Twoja zachęta zastępuje wynik. man stat mówi, że –printf pomija końcowy znak nowej linii. Użyj --format lub -c, aby zobaczyć wynik. Uzyskaj więcej informacji, porównując stat --printf="%s" file.any | xxd - z stat -c "%s" file.any | xxd -

Odpowiedź

file_size_kb=`du -k "$filename" | cut -f1` 

Problem z używaniem stat polega na tym, że jest to rozszerzenie GNU (Linux). du -k i cut -f1 są określane przez POSIX i dlatego można je przenosić na każdy system Unix.

Na przykład Solaris jest dostarczany z bash, ale nie z stat . Nie jest to więc całkowicie hipotetyczne.

ls ma podobny problem polegający na tym, że nie jest określony dokładny format wyniku, więc nie można przeprowadzić analizy jego wyniku przenośnego . du -h to także rozszerzenie GNU.

Jeśli to możliwe, trzymaj się przenośnych konstrukcji, a ułatwisz komuś życie w przyszłości. Może swoje.

Komentarze

  • du nie ' nie daje rozmiar pliku, wskazuje, ile miejsca zajmuje plik, który jest nieco inny (zwykle rozmiar podawany przez du to rozmiar pliku zaokrąglony w górę do najbliższej liczba bloków, gdzie blok ma zazwyczaj 512B lub 1kB lub 4kB).
  • @Gilles, rzadkie pliki (tj. te z dziurami) zgłaszają mniej niż długość.
  • To, z --bytes lub -b zamiast -k, powinno być akceptowaną odpowiedzią.
  • @fralau: OP chce ” przypisać to do zmiennej bash, aby mogli użyć jej później „, więc jest bardziej prawdopodobne, że chcą aktu al wartość liczbowa, a nie przybliżenie czytelne dla człowieka. Ponadto -h jest rozszerzeniem GNU; to nie jest standard
  • Użycie du z --apparent-size flagą zwróci więcej dokładny rozmiar (jak podano dla man: print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be larger due to holes in ('sparse') files, internal fragmentation, indirect blocks, and the like)

Odpowiedź

Możesz także użyć polecenia„ liczba słów ”(wc):

wc -c "$filename" | awk "{print $1}" 

Problem z wc polega na tym, że „doda nazwę pliku i wciśnie dane wyjściowe. Na przykład:

$ wc -c somefile.txt 1160 somefile.txt 

Jeśli chcesz uniknąć łączenia w łańcuch pełnego interpretowanego języka lub edytora strumieniowego tylko po to, aby uzyskać licznik rozmiaru pliku, po prostu przekieruj dane wejściowe z pliku, aby wc nigdy nie widział nazwy pliku:

wc -c < "$filename" 

Tej ostatniej postaci można użyć z podstawianiem poleceń, aby łatwo pobrać szukaną wartość jako zmienną powłoki, o czym wspomina Gilles poniżej.

size="$(wc -c <"$filename")" 

Komentarze

  • wc -c <"$FILENAME" podaje rozmiar bez innego cruft, a zatem size=$(wc -c <"$FILENAME").
  • Jeszcze tylko jeden punkt: właśnie go przetestowałem i wc -c < file wydaje się działać bardzo szybko, przynajmniej w systemie OS X. I ' zgaduję, że wc ma mózg, aby spróbować statować plik, jeśli podano tylko -c.
  • @EdwardFalk: GNU wc -c używa fstat, ale następnie szuka przedostatniego bloku pliku i odczytuje ostatni do st_blksize bajtów. Najwyraźniej dzieje się tak, ponieważ pliki w Linuksie ' s /proc i ma tylko przybliżone rozmiary statystyk , a wc chce podawać rzeczywisty rozmiar, a nie rozmiar raportowany przez statystyki. Wydaje mi się, że byłoby dziwnie, gdyby wc -c zgłosił inny rozmiar niż wc, ale ' nie jest pomysłem odczytywania danych z pliku, jeśli ' jest zwykłym plikiem na dysku, a ' nie ma w pamięci. Lub, co gorsza, pamięć taśmowa near-line …
  • Wygląda na to, że printf nadal widzi wcięcie, np. printf "Size: $size" – > size: <4 spaces> 54339. Z drugiej strony echo ignoruje spacje. Czy jest jakiś sposób, aby było spójne?
  • @keithpjolley: dzwoniąc pod numer fstat. Spróbuj uruchomić strace wc -c </etc/passwd, a zobaczysz, co robi.

Odpowiedz

BSD „s (macOS” s) stat ma inną flagę argumentu formatu i różne specyfikatory pól. Od man stat(1):

  • -f format: Wyświetl informacje przy użyciu określonego formatu. Zobacz sekcję FORMATY, aby uzyskać opis prawidłowych formatów.
  • … sekcja FORMATY …
  • z: rozmiar plik w bajtach.

Więc teraz wszystko razem:

stat -f%z myfile1.txt 

UWAGA: patrz @ b01 „s odpowiedź , jak używać polecenia stat w systemach GNU / Linux. 🙂

Komentarze

  • Zauważ, że jest to rozwiązanie tylko dla BSD. Nie ' nie działa z GNU stat niestety.

Odpowiedź

Zależy, co rozumiesz przez rozmiar .

size=$(wc -c < "$file") 

poda liczbę bajtów, które można odczytać z pliku. IOW, to jest rozmiar zawartości pliku. Jednak odczyta zawartość pliku (z wyjątkiem sytuacji, gdy plik jest zwykłym plikiem lub dowiązaniem symbolicznym do zwykłego pliku w większości implementacji wc w celu optymalizacji). To może mieć skutki uboczne. Na przykład w przypadku nazwanego potoku to, co zostało przeczytane, nie może być już odczytane ponownie, a w przypadku rzeczy takich jak /dev/zero lub /dev/random nieskończony rozmiar, zajmie to trochę czasu. Oznacza to również, że potrzebujesz uprawnień read do pliku, a ostatnia sygnatura czasowa dostępu do pliku może być zaktualizowany.

To jest standardowe i przenośne, jednak należy zauważyć, że niektóre wc implementacje mogą zawierać początkowe spacje w tych danych wyjściowych. Jednym ze sposobów na pozbycie się ich jest użycie:

size=$(($(wc -c < "$file"))) 

lub uniknięcie błędu dotyczącego pustego wyrażenia arytmetycznego w dash lub yash, gdy wc nie daje żadnego wyniku (np. gdy pliku nie można otworzyć):

size=$(($(wc -c < "$file") +0)) 

ksh93 ma wbudowane wc (jeśli to włączysz, możesz je również wywołać jako command /opt/ast/bin/wc), co czyni go najbardziej wydajnym dla zwykłych plików w tej powłoce.

Różne systemy mają polecenie o nazwie stat to „interfejs do wywołań systemowych stat() lub lstat().

Te informacje raportu znajdują się w i-węzeł. Jedną z tych informacji jest atrybut st_size. W przypadku zwykłych plików jest to rozmiar zawartości (ile danych można z nich odczytać w przypadku braku błędu (właśnie tego używa większość wc -c implementacji do optymalizacji) ). W przypadku dowiązań symbolicznych jest to rozmiar ścieżki docelowej w bajtach. W przypadku nazwanych potoków, w zależności od systemu, jest to 0 lub liczba bajtów aktualnie znajdujących się w buforze potoku. To samo dotyczy urządzeń blokowych, gdzie w zależności od systemu otrzymujesz 0 lub rozmiar w bajtach pamięci bazowej.

Nie potrzebujesz uprawnień do odczytu pliku, aby uzyskać te informacje, tylko uprawnienia do wyszukiwania katalog, z którym jest połączony.

W porządku chronologicznym mamy:

  • IRIX stat (90 „s):

    stat -qLs -- "$file" 

    zwraca atrybut st_size $file (lstat()) lub:

    stat -s -- "$file" 

    to samo z wyjątkiem $file jest dowiązaniem symbolicznym, w którym to przypadku jest to st_size pliku po rozwiązaniu dowiązania symbolicznego.

  • zsh stat wbudowany (obecnie znany również jako zstat) w module zsh/stat (załadowanym przez zmodload zsh/stat) (1997):

    stat -L +size -- $file # st_size of file stat +size -- $file # after symlink resolution 

    lub do przechowywania w zmiennej:

    stat -L -A size +size -- $file 

    oczywiście jest to najbardziej wydajne w tę powłokę.

  • GNU stat (2001); również w BusyBox stat od 2 005 (skopiowane z GNU stat):

    stat -c %s -- "$file" # st_size of file stat -Lc %s -- "$file" # after symlink resolution 

    (zwróć uwagę na znaczenie -L jest odwrócony w porównaniu z IRIX lub zsh stat.

  • BSD stat (2002):

    stat -f %z -- "$file" # st_size of file stat -Lf %z -- "$file" # after symlink resolution 

Lub możesz użyć funkcji stat() / lstat() jakiegoś języka skryptowego, takiego jak perl:

perl -le "print((lstat shift)[7])" -- "$file" 

AIX ma również istat polecenie , które zrzuci wszystkie stat() (nie lstat(), więc nie będzie działać z linkami symbolicznymi ) informacje, które można przetworzyć w dalszej części, na przykład:

LC_ALL=C istat "$file" | awk "NR == 4 {print $5}" 

(dzięki @JeffSchaller za pomoc w ustaleniu szczegółów ).

W tcsh:

@ size = -Z $file:q 

(rozmiar po rozwiązaniu dowiązania symbolicznego)

Na długo przed wprowadzeniem przez GNU polecenia stat, to samo można osiągnąć za pomocą GNU find polecenie z predykatem -printf (już w 1991 r.):

find -- "$file" -prune -printf "%s\n" # st_size of file find -L -- "$file" -prune -printf "%s\n" # after symlink resolution 

Problem polega jednak na tym, że nie „t działa, jeśli $file zaczyna się od - lub jest predykatem find (np. !, ( …).

Standardowe polecenie do pobrania stat() / lstat() to ls.

Podobnie, możesz:

LC_ALL=C ls -dn -- "$file" | awk "{print $5; exit}" 

i dodaj -L dla tego samego po rozwiązaniu dowiązania symbolicznego. Nie działa to jednak w przypadku plików urządzeń, gdzie 5 th pole to numer główny urządzenia zamiast jego rozmiaru.

W przypadku urządzeń blokowych systemy, w których stat() zwraca 0 dla st_size, zwykle mają inne interfejsy API do raportowania rozmiaru urządzenia blokowego. Na przykład Linux ma BLKGETSIZE64 ioctl(), a większość dystrybucji Linuksa jest teraz dostarczanych z poleceniem blockdev, które może z niego skorzystać:

blockdev --getsize64 -- "$device_file" 

Jednak do tego potrzebne są uprawnienia do odczytu pliku urządzenia. Zwykle można określić rozmiar w inny sposób. Na przykład (nadal w Linuksie):

lsblk -bdno size -- "$device_file" 

Powinien działać z wyjątkiem pustych urządzeń.

Podejście, które działa dla wszystkich seekable files (obejmuje to zwykłe pliki, większość urządzeń blokowych i niektóre urządzenia znakowe) polega na otwarciu pliku i szukaniu do końca:

  • Z zsh (po załadowaniu modułu zsh/system):

    {sysseek -w end 0 && size=$((systell(0)))} < $file 
  • Z ksh93:

    < "$file" <#((size=EOF)) 

    lub

    { size=$(<#((EOF))); } < "$file" 
  • with perl:

    perl -le "seek STDIN, 0, 2 or die "seek: $!"; print tell STDIN" < "$file" 

W przypadku potoków nazwanych widzieliśmy, że niektóre systemy (przynajmniej AIX, Solaris, HP / UX) udostępniają ilość danych w buforze potoku w stat() „s st_size. Niektóre (jak Linux czy FreeBSD) nie „t.

Przynajmniej w Linuksie możesz użyć FIONREAD ioctl() po otwarciu potoku (w trybie odczytu + zapisu, aby uniknąć jego zawieszenia):

fuser -s -- "$fifo_file" && perl -le "require "sys/ioctl.ph"; ioctl(STDIN, &FIONREAD, $n) or die$!; print unpack "L", $n" <> "$fifo_file" 

Pamiętaj jednak, że chociaż nie „t czyta zawartość potoku, samo otwarcie potoku nazwanego w tym miejscu nadal może mieć skutki uboczne. Używamy fuser, aby najpierw sprawdzić, czy jakiś proces ma już otwarty potok, aby to złagodzić, ale nie jest to niezawodne, ponieważ fuser nie móc sprawdzić wszystkich procesów.

Do tej pory rozważaliśmy tylko rozmiar podstawowych danych powiązanych z plikami.To nie bierze pod uwagę rozmiaru metadanych i całej infrastruktury pomocniczej potrzebnej do przechowywania tego pliku.

Inny atrybut i-węzła zwrócony przez stat() to st_blocks. To liczba 512-bajtowych bloków używanych do przechowywania danych pliku (a czasem niektórych jego metadanych, takich jak rozszerzone atrybuty w systemach plików ext4 w systemie Linux). „nie dołączaj samego i-węzła lub wpisów w katalogach, do których jest dowiązany plik.

Rozmiar i wykorzystanie dysku niekoniecznie są ściśle powiązane, jak kompresja, rzadkość (czasami niektóre metadane), dodatkowa infrastruktura, taka jak bloki pośrednie w niektórych systemach plików ma wpływ na to drugie.

Zazwyczaj du używa do raportowania użycia dysku. Większość wymienionych powyżej poleceń będzie w stanie uzyskać te informacje.

  • POSIXLY_CORRECT=1 ls -sd -- "$file" | awk "{print $1; exit}"
  • POSIXLY_CORRECT=1 du -s -- "$file" (nie dotyczy katalogów gdzie obejmowałoby to użycie dysku e znajdujących się w nim plików).
  • GNU find -- "$file" -printf "%b\n"
  • zstat -L +block -- $file
  • GNU stat -c %b -- "$file"
  • BSD stat -f %b -- "$file"
  • perl -le "print((lstat shift)[12])" -- "$file"

Komentarze

  • zdecydowanie najbardziej wyczerpująca i pouczająca odpowiedź. Dziękuję Ci. mogę użyć tego do tworzenia wieloplatformowych skryptów bash przy użyciu statystyk BSD i GNU
  • Ciekawostka: GNU coreutils wc -c używa fstat, ale odczytuje ostatnie maksymalnie st_blksize bajtów. Najwyraźniej dzieje się tak, ponieważ pliki w Linuksie ' s /proc i mają tylko przybliżone rozmiary statystyk . Jest to dobre dla poprawności, ale złe, jeśli koniec pliku znajduje się na dysku, a nie w pamięci (zwłaszcza jeśli jest używany na wielu plikach w pętli). I bardzo źle, jeśli plik jest migrowany do bliskiej linii pamięci taśmowej , lub np. system plików FUSE z przezroczystą dekompresją.
  • to też nie zadziała ls -go file | awk '{print $3}'
  • @StevenPenny te -go byłyby tymi SysV, nie działałyby ' na BSD (opcjonalne (XSI) w POSIX). ' Potrzebujesz również ls -god file | awk '{print $3; exit}' (-d, aby działał na katalogach, exit dla dowiązań symbolicznych z nowymi liniami w miejscu docelowym). Pozostają również problemy z plikami urządzeń.
  • @ αғsнιη Unix API nie rozróżnia plików tekstowych i binarnych. To ' to wszystkie sekwencje bajtów. Niektóre aplikacje mogą chcieć interpretować te bajty jako tekst, ale oczywiście nie wc -c, które podaje liczbę bajtów.

Odpowiedź

Ten skrypt łączy wiele sposobów obliczania rozmiaru pliku:

( du --apparent-size --block-size=1 "$file" 2>/dev/null || gdu --apparent-size --block-size=1 "$file" 2>/dev/null || find "$file" -printf "%s" 2>/dev/null || gfind "$file" -printf "%s" 2>/dev/null || stat --printf="%s" "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null || wc -c <"$file" 2>/dev/null ) | awk "{print $1}" 

Skrypt działa na wielu systemach uniksowych w tym Linux, BSD, OSX, Solaris, SunOS, itp.

Rozmiar pliku pokazuje liczbę bajtów. Jest to pozorny rozmiar, czyli liczba bajtów używanych przez plik na typowym dysku, bez specjalnej kompresji, specjalnych rzadkich obszarów, nieprzydzielonych bloków itp.

Ten skrypt ma wersję produkcyjną z większą pomocą i więcej opcji tutaj: https://github.com/SixArm/file-size

Odpowiedź

stat wydaje się robić to z najmniejszą liczbą wywołań systemowych:

$ set debian-live-8.2.0-amd64-xfce-desktop.iso $ strace stat --format %s $1 | wc 282 2795 27364 $ strace wc --bytes $1 | wc 307 3063 29091 $ strace du --bytes $1 | wc 437 4376 41955 $ strace find $1 -printf %s | wc 604 6061 64793 

Odpowiedź

ls -l filename poda wiele informacji o pliku, w tym o jego rozmiarze, uprawnieniach i właścicielu.

Rozmiar pliku w piątej kolumnie i jest wyświetlany w bajtach. W poniższym przykładzie rozmiar pliku jest nieco poniżej 2 KB:

-rw-r--r-- 1 user owner 1985 2011-07-12 16:48 index.php 

Edytuj: Najwyraźniej nie jest to tak wiarygodne jak polecenie stat.

Komentarze

  • Myślę, że zarówno polecenie ls -l, jak i stat podają wiarygodne informacje o rozmiarze. Nie znalazłem żadnego przeciwnego odniesienia. ls -s poda rozmiar w liczbie bloków.
  • @ dabest1 to ' nie jest wiarygodne w tym sensie, że inny unix, ich wyjście może być inne (aw niektórych unixach tak jest).
  • Tak, IIRC, Solaris nie ' domyślnie wyświetlał nazwę grupy, co prowadzi do mniejszej liczby kolumn w wyniku.
  • Ponieważ rozmiar jest czysto liczbowy, otoczony białymi znakami, a data rok jest czysto numeryczna, w zdefiniowanym formacie byłoby możliwe użycie wyrażenia regularnego do traktowania użytkownika + właściciel jako jedno pole, niezależnie od tego, czy grupa była obecna, czy nie. (ćwiczenie dla czytelnika!)

Odpowiedź

du filename powie Ci użycie dysku w bajtach.

Wolę du -h filename, który podaje rozmiar w formacie czytelnym dla człowieka.

Komentarze

  • that or stat -c "%s"😉
  • Ten wariant du wyświetla rozmiar w blokach 1024 bajty, a nie prosta liczba bajtów.
  • Zwróć uwagę, że standardowe du dają wynik w liczbie 512-bajtowych jednostek. GNU du zamiast tego używa kibibajtów, chyba że zostanie wywołane z POSIXLY_CORRECT w swoim środowisku.
  • Dla plików typu katalog , który podaje użycie katalogu, ale także wszystkich innych plików w nim zawartych (rekurencyjnie).

Odpowiedz

Utwórz małe funkcje narzędziowe w skryptach powłoki, którym możesz delegować.

Przykład

#! /bin/sh - # vim: set ft=sh # size utility that works on GNU and BSD systems size(){ case $(uname) in (Darwin | *BSD*) stat -Lf %z -- "$1";; (*) stat -c %s -- "$1" esac } for f do printf "%s\n" "$f : $(gzip < "$f" | wc -c) bytes (versus $(size "$f") bytes)" done 

Na podstawie informacji uzyskanych z odpowiedzi @ Stéphane Chazelas „.

Komentarze

  • Zobacz także gzip -v < file > /dev/null, aby sprawdzić, czy plik jest kompresowalny.
  • @St é phaneChazelas nie jest pewien, czy uważam, że to poprawa. Te opisy przypadków mogą z łatwością zniechęcić noobsów; z pewnością nigdy nie pamiętam, jak je naprawić 🙂 są z natury bardziej przenośne, ponieważ ty czy to się stało? Widzę sens, kiedy jest więcej niż dwa przypadki, ale poza tym … +
  • Przypuszczam, że ' to także kwestia gustu, ale tutaj ' jest typowym przypadkiem, w którym ' chcesz użyć case instrukcja. case to konstrukcja Bourne / POSIX do dopasowywania wzorców. [[...]] to tylko ksh / bash / zsh (z wariacjami).

Odpowiedź

Znalazłem liner AWK 1 i miał błąd, ale naprawiłem go. Dodałem również w PetaBytes po TeraBytes.

FILE_SIZE=234234 # FILESIZE IN BYTES FILE_SIZE=$(echo "${FILE_SIZE}" | awk "{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }") 

Biorąc pod uwagę stat nie występuje w każdym systemie, prawie zawsze możesz użyć rozwiązania AWK. Przykład; Raspberry Pi nie ma stat , ale ma awk .

Komentarze

  • Zupełnie NIE to, o co prosił OP, ale niezła robota.

Odpowiedź

Sama podoba mi się opcja wc. W połączeniu z „bc” możesz uzyskać ułamki dziesiętne do dowolnej liczby miejsc.

Chciałem ulepszyć skrypt, który kazałem temu awkowi usunąć kolumnę „rozmiaru pliku” z kolumny „ls – alh „. Nie chciałem tylko całkowitych rozmiarów plików, a dwa miejsca po przecinku wydawały się pasować, więc po przeczytaniu tej dyskusji wymyśliłem poniższy kod.

Proponuję przełamać linię średnikami, jeśli umieścisz to w skrypcie.

file=$1; string=$(wc -c $file); bite=${string% *}; okay=$(echo "scale=2; $bite/1024" | bc);friend=$(echo -e "$file $okay" "kb"); echo -e "$friend"

Mój skrypt nazywa się gpfl , co oznacza „pobierz długość pliku obrazu”. Używam go po wykonaniu mogrify na pliku w imagemagick, przed otwarciem lub ponownym załadowaniem obrazu w przeglądarce jpeg z GUI.

Nie wiem, jak to ocenia „odpowiedź”, ponieważ wiele zapożycza z tego, co zostało już zaoferowane i omówione. Więc zostawię to tam.

BZT

Komentarze

  • Wolałbym używać ” stat ” lub ” ls „. Zazwyczaj ' nie lubię używać ” wc „, aby uzyskać rozmiary plików, ponieważ fizycznie odczytuje cały plik. Jeśli masz dużo plików lub szczególnie duże pliki, może to zająć dużo czasu. Ale Twoje rozwiązanie jest kreatywne … + 1.
  • Zgadzam się z pojęciem korzystania z ” stat ” ponad ” wc ” dla rozmiaru pliku, jednak jeśli użyjesz ” wc -c „, żadne dane nie zostaną odczytane; zamiast tego zostanie użyty lseek oblicz liczbę bajtów w pliku. lingrok.org/xref/coreutils/src/wc.c#228
  • @ bbaja42 : zauważ, że GNU Coreutils czyta ostatni blok pliku, na wypadek gdyby stat.st_size było tylko przybliżeniem (jak dla Linuksa /proc i /sys plików). Wydaje mi się, że postanowili nie komplikować głównego komentarza, gdy dodali tę logikę kilka wierszy w dół: lingrok.org/xref/coreutils/src/wc.c#246

Odpowiedź

Najszybsza i najprostsza (IMO) metoda to:

bash_var=$(stat -c %s /path/to/filename) 

Komentarze

  • Następnie zagłosuj za jedną lub więcej istniejących odpowiedzi, które wspominają o statystykach; nie ma potrzeby powtarzania tego ponownie …
  • @JeffSchaller Właśnie zagłosowałem za Stephane ' na twoje instrukcje.Myślę, że jest to zbyt skomplikowane dla moich celów. Dlatego właśnie opublikowałem tę prostą odpowiedź dla podobnie myślących dusz.
  • Dziękuję; to ' to po prostu szóste wystąpienie ” stat ” odpowiedź nie ' nie upraszcza tego Q & A, ale wolałby, aby nowy czytelnik zadawał sobie pytanie ” czym ta odpowiedź różni się od innych? ” i prowadzi do większego zamieszania zamiast mniejszego.
  • Wydaje mi się, że @JeffSchaller. Mogę jednak narzekać na wiele du i wc odpowiedzi, które powinny zawierać zastrzeżenie NIGDY TEGO NIE ROBIĆ życie. Właśnie użyłem mojej odpowiedzi w prawdziwej aplikacji dziś wieczorem i pomyślałem, że warto się nią podzielić. Chyba wszyscy mamy swoje zdanie wzrusza ramionami .

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *