
Ich möchte prüfen, ob die Größe der neuesten Datei größer als 2 MB ist:
test $(ls -st | head -n2 | tail -n1 | awk '{print $1}') -gt 2097152 && echo "true"
Gibt es eine effizientere oder elegantere Möglichkeit, dies zu tun?
Ich habe versucht, die Ausgabe von awk weiterzuleiten an
| test {} -gt 2097152
aber bekommen
bash: test: {}: ganzzahliger Ausdruck erwartet
Dann
| test {}>"2097152"
ergibt immer "true", also habe ich mir die Konstruktion ausgedacht
test $(...) -gt 2097152
Antwort1
Es mag bessere Möglichkeiten geben, als ls
die neueste Datei abzurufen, aber das meiste, was Sie tun, können Sie einfach in awk erledigen:
ls -st | awk 'NR == 2 && $1 > 2097152 {print "true"}'
NR == 2
- in der zweiten Zeile$1 > 2097152
- wenn die erste Spalte größer als 2097152 ist
Antwort2
Mit zsh
:
set -- *(.om[1]) *(N.L+2097152om[1])
if [[ $1 = $2 ]]; then
printf '%s\n' "The apparent size of the newest non-hidden regular file in the current" \
"directory ($1) is strictly greater than 2MiB."
fi
Wenn Sie versteckte Verzeichnisse einschließen möchten, fügen Sie D
beiden Glob-Qualifizierern hinzu. Wenn Sie nicht reguläre Dateien (Verzeichnisse, Symlinks, Geräte...) berücksichtigen möchten, entfernen Sie.
Die Idee besteht darin, diese beiden Globs zu erweitern:
- die Liste der nicht versteckten regulären (
.
) Dateien,o
sortiert nachm
Änderungszeitpunkt, begrenzt auf eine ([1]
). - das Gleiche, aber beschränkt auf Dateien, deren
L
Länge strikt größer (+
) ist als2097152
(aberN
ullGlob wird aktiviert, sodass es kein schwerwiegender Fehler ist, wenn keine Übereinstimmung vorliegt).
Und unsere Bedingung ist, dass beide Globs in dieselbe Datei expandiert werden.
Beachten Sie, dass ls -s
nicht die Größe der Dateien gemeldet wird, sondern deren Festplattennutzung (in Einheiten von 512 Byte oder KiB oder anderen Einheiten, je nach Implementierung ls
und/oder Umgebung). ls
meldet die darin enthaltene DateigrößelangAusgabeformat ( ls -l
oder ls -n
(oder -o
/ -g
bei einigen Implementierungen)).
zsh
Eine andere Möglichkeit besteht darin , das integrierte Feature von zu verwenden, stat
um die Größe (oder den Festplattenverbrauch) der neuesten Datei abzurufen:
zmodload zsh/stat
if
stat -LH s -- *(.om[1]) &&
((s[size] > 2097152))
then
printf '%s\n' "The apparent size of the newest non-hidden regular file in the current" \
"directory ($1) is strictly greater than 2MiB."
fi
Oder:
zmodload zsh/stat
if
stat -LH s -- *(.om[1]) &&
((s[blocks] > 2097152))
then
printf '%s\n' "The newest non-hidden regular file in the current directory" \
"($1) uses more than 2097152 512-byte units of disk space."
fi
(mit anderen Worten, die Festplattennutzung beträgt mehr als 1 GiB)