
Ich habe herausgefunden, dass ich „c“ verwende, um nach der Dateigröße in Bytes zu suchen.
Ich kann also mit „find . -size 1000c“ nach einer Dateigröße von 1000 Bytes suchen.
Aber was ist mit anderen Größen wie Mb, Gb oder sogar Bits? Welche Zeichen oder Buchstaben muss ich verwenden?
Antwort1
POSIXgibt nur kein Suffix oder ein c
Suffix an. Ohne Suffix werden Werte als 512-Byte-Blöcke interpretiert; mit c
Suffix werden Werte als Byte-Anzahl interpretiert, wie Sie ermittelt haben.
Einige Implementierungen unterstützen weitere Suffixe. Zum BeispielGNUfind
unterstützt
b
für 512-Byte-Blöckec
für Bytesw
für 2-Byte-Wörterk
für KibibyteM
für MebibyteG
für Gibibyte
Antwort2
find . -size 1000c # files whose size¹ is exactly 1000 bytes (not characters)
find . -size -1000c # strictly less than 1000 bytes (0 - 999)
find . -size +1000c # strictly more than 1000 bytes (1001 - ∞)
Anschließend sh
können Sie mit der POSIX-Syntax Folgendes tun:
EiB=$((1024*(PiB=1024*(TiB=1024*(GiB=1024*(MiB=1024*(KiB=1024)))))))
EB=$((1000*( PB=1000*( TB=1000*( GB=1000*( MB=1000*( kB=1000)))))))
find . -size "$(( 12 * GiB ))c" # exactly 12GiB (12,884,901,888 bytes)
find . -size "$(( 12 * GB ))c" # exactly 12GB (12,000,000,000 bytes)
find . -size "-$(( 12 * GB ))c" # 0 - 11,999,9999,999 bytes
...
Ohne das c
Suffix kann das Verhalten überraschend sein:
find . -size 1000 # files whose size, in number of 512-byte units (rounded *up*)
# is 1000. So, that's file whose size in bytes ranges from
# 1000*512-511 (999*512+1) to 512*1000
find . -size -1000 # files whose size is 999*512 bytes or less
find . -size +1000 # files whose size is 1000*512+1 bytes or more
Das ist alles zur POSIX-Spezifikation des find
Dienstprogramms.
Jetzt find
unterstützen verschiedene Implementierungen zusätzliche Suffixe. Beachten Sie jedoch, dass dieselben Suffixe von verschiedenen Implementierungen unterschiedlich interpretiert werden können.
Alsnotiert von @StephenKitt,GNUfind
unterstützt cwbkMG
Byte, Wort, 512-Byte-Einheiten, Kibibyte, Mebibyte, Gibibyte, verhält sich aber wie von POSIX find
gefordert, da find . -size -12G
es sich beispielsweise nicht um dasselbe wie unser find . -size "-$((12 * GiB))c"
obiges Beispiel handelt, da es sich dabei um Dateien handelt, deren Größe in Gibibyte (aufgerundet) strikt unter 12 liegt, also Dateien mit 11 GiB oder weniger.
Findet beispielsweise find . -size -1G
nur leere Dateien (Dateien der Größe 0). Eine 1-Byte-Datei wird als 1 GiB groß angesehen, da die Größe auf das nächste GiB aufgerundet wird.
beschäftigtboxfind
unterstützt cwbk
Suffixe, interpretiert sie aber anders als GNU find
. Es ist auchderzeit nicht POSIX-kompatibel im Umgang mit Größen ohne Suffixe.
Für Busybox find
,find . -size -12G
Istwie find . -size "-$(( 12 * GiB ))c"
und find . -size -1
ist für Größen im Bereich von 0 bis 511 statt nur 0.
Spielzeugboxfind
(wie man es zum Beispiel auf Android findet) verhält sich find
in dieser Hinsicht wie busybox (und ist auchnicht POSIX-kompatibel). Ein weiterer Unterschied besteht darin, dass Suffixe hier nicht TPE
zwischen Groß- und Kleinschreibung unterscheiden und Tebibyte, Pebibyte und Exbibyte ebenfalls unterstützt werden und ein d
(dezimales) zusätzliches Suffix verwendet werden kann, um anzugeben, dass die Einheiten Potenzen von 1000 statt 1024 sind. So -size 1kd
findet beispielsweise Dateien, die genau 1000 Bytes (1 Kilobyte) statt 1024 Bytes (1 Kibibyte) groß sind, für -size 1k
.
In Toybox find
erfolgt die Suffixbehandlung als Teil seiner atolx()
Funktion, die nicht nur für verwendet wird find
. Beachten Sie jedoch, dass 0xffff
es einen Konflikt gibt, da hexadezimale Zahlen unterstützt werden, da cbedCBED
dies auch hexadezimale Ziffern sind. -size -0x2c
ist nicht für weniger als 0x2 Bytes, sondern für weniger als 0x2c (44) 512-Byte-Einheiten. Und -size 010c
wird als (oktal) behandelt -size 8c
, eine weitere POSIX-Nichtkonformität.
FreeBSD/DragonFly BSD find
Unterstützung ckMGTP
(nicht bwE
), aber während es sich ohne Suffix wie von POSIX gefordert verhält, verhält es sich wie Busybox/Toybox und nicht wie GNU, find
wenn ein Suffix² vorhanden ist.
sfind
oder die find
eingebauten Funktionen der bosh-Shell verhalten sich wie die von FreeBSD, außer dass Suffixe nicht case-sensitiv sind und bwE
unterstützt werden und Oktal-/Dezimalzahlen und einigeProduktarithmetikausdrücke(wie beispielsweise 6x12x8k
) werden akzeptiert.
Soweit ich das beurteilen kann,OpenBSD,NetBSD,Illumos,Solaris,AIX,HP/UXunterstützt kein Suffix nur für 512-Byte-Einheiten oder c
für Byte, wie von POSIX gefordert.
Eine Übersichtstabelle:
Traditionell/POSIX | GNU | FreeBSD | sfind | beschäftigtbox | Spielzeugbox | |
---|---|---|---|---|---|---|
Suffixe | C | Abonnieren | ckMGTP | cwbkmgtpeCWBKMGTPE | cwbk | cwbkmgtpeCWBKMGTPE (+d) |
Zahlenformat | Dezimal | Dezimal | Dezimal | Dez/Okt/Hex/Ausdruck | Dezimal | Dez/Okt/Hex |
-size $n |
($n-1)*512+1 .. $n*512 | ($n-1)*512+1 .. $n*512 | ($n-1)*512+1 .. $n*512 | ($n-1)*512+1 .. $n*512 | $n*512 | $n*512 |
-size -$n |
0 .. ($n-1)*512 | 0 .. ($n-1)*512 | 0 .. ($n-1)*512 | 0 .. ($n-1)*512 | 0 .. $n*512-1 | 0 .. $n*512-1 |
-size +$n |
($n*512)+1 .. ∞ | ($n*512)+1 .. ∞ | ($n*512)+1 .. ∞ | ($n*512)+1 .. ∞ | ($n*512)+1 .. ∞ | ($n*512)+1 .. ∞ |
-size ${n}c |
$n | $n | $n | $n | $n | $n |
-size -${n}c |
0 .. $n-1 | 0 .. $n-1 | 0 .. $n-1 | 0 .. $n-1 | 0 .. $n-1 | 0 .. $n-1 |
-size +${n}c |
$n+1 .. ∞ | $n+1 .. ∞ | $n+1 .. ∞ | $n+1 .. ∞ | $n+1 .. ∞ | $n+1 .. ∞ |
-size $n$unit |
N / A | ($n-1)*$Einheit+1 .. $n*$Einheit | $n*$Einheit | $n*$Einheit | $n*$Einheit | $n*$Einheit |
-size -$n$unit |
N / A | 0 .. ($n-1)*$Einheit | 0 .. $n*$Einheit-1 | 0 .. $n*$Einheit-1 | 0 .. $n*$Einheit-1 | 0 .. $n*$Einheit-1 |
-size +$n$unit |
N / A | $n*$Einheit+1 .. ∞ | $n*$Einheit+1 .. ∞ | $n*$Einheit+1 .. ∞ | $n*$Einheit+1 .. ∞ | $n*$Einheit+1 .. ∞ |
Kurz gesagt: Aus Gründen der Portabilität verwenden Sie am besten das c
Suffix, also ausschließlich Dezimalzahlen ohne führende Nullen, und berechnen die Einheiten manuell.
Der Vollständigkeit halber sei erwähnt, L
dass sich der Glob-Qualifizierer zsh
( kmgt
ohne Berücksichtigung der Groß-/Kleinschreibung, aber pP
für eine 512-Byte-Einheit, nicht für ein Pebibyte) wie POSIX/GNU verhält find
( *(LM-12)
wird beispielsweise auf Dateien erweitert, deren Größe zwischen 0 und 11 Mebibyte liegt).
¹ Dies ist die Größe, die im st_size
Attribut der zurückgegebenen Struktur angegeben ist lstat()
. Die Bedeutung dieser Funktion für nicht reguläre Dateien kann je nach System unterschiedlich sein.
find
² In FreeBSD / gibt es dieselbe Art der Unterscheidung sfind
für die -Xtime
Prädikate, wo beispielsweise -mtime +1
Übereinstimmungen mit Dateien bestehen, die 2 Tage oder älter sind (Alter 86400*2 - ∞), während -mtime +1d
Übereinstimmungen mit Dateien bestehen, die älter als einen Tag sind (Alter 86400.000000001 - ∞). Bei GNU find
siehe auch ! -newermt -1day
(oder 1 day ago
oder yesterday
).
Antwort3
Um das zu ergänzen, was Stephen Kitt erwähnt hat, beachten Sie, dass gnu findrundet aufdie Größe vor dem Vergleich auf die angegebene Granularität!
Wenn Sie tun
truncate --size=1000 dummy_file_1000
truncate --size=1024 dummy_file_1024
Dann
find . -size 1k
find . -size 1024c
Willenichtdas gleiche Ergebnis liefern!
SehenBefehl „find“: -size-Verhalten
Kurz gesagt – find . -size 1k
es werden alle Dateien mit der Größe ∈[1,1024] aufgelistet, während find . -size 1024c
nur Dateien aufgelistet werden, deren tatsächliche Größe genau 1024 Byte beträgt.