Welche Dateigrößenoptionen gibt es für den Befehl „find . -size“?

Welche Dateigrößenoptionen gibt es für den Befehl „find . -size“?

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 cSuffix an. Ohne Suffix werden Werte als 512-Byte-Blöcke interpretiert; mit cSuffix werden Werte als Byte-Anzahl interpretiert, wie Sie ermittelt haben.

Einige Implementierungen unterstützen weitere Suffixe. Zum BeispielGNUfindunterstützt

  • bfür 512-Byte-Blöcke
  • cfür Bytes
  • wfür 2-Byte-Wörter
  • kfür Kibibyte
  • Mfür Mebibyte
  • Gfür Gibibyte

Antwort2

POSIXly:

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 shkö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 cSuffix 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 findDienstprogramms.

Jetzt findunterstützen verschiedene Implementierungen zusätzliche Suffixe. Beachten Sie jedoch, dass dieselben Suffixe von verschiedenen Implementierungen unterschiedlich interpretiert werden können.

Alsnotiert von @StephenKitt,GNUfindunterstützt cwbkMGByte, Wort, 512-Byte-Einheiten, Kibibyte, Mebibyte, Gibibyte, verhält sich aber wie von POSIX findgefordert, da find . -size -12Ges 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 -1Gnur 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äftigtboxfindunterstützt cwbkSuffixe, 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 -1ist 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 findin dieser Hinsicht wie busybox (und ist auchnicht POSIX-kompatibel). Ein weiterer Unterschied besteht darin, dass Suffixe hier nicht TPEzwischen 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 1kdfindet beispielsweise Dateien, die genau 1000 Bytes (1 Kilobyte) statt 1024 Bytes (1 Kibibyte) groß sind, für -size 1k.

In Toybox finderfolgt die Suffixbehandlung als Teil seiner atolx()Funktion, die nicht nur für verwendet wird find. Beachten Sie jedoch, dass 0xffffes einen Konflikt gibt, da hexadezimale Zahlen unterstützt werden, da cbedCBEDdies auch hexadezimale Ziffern sind. -size -0x2cist nicht für weniger als 0x2 Bytes, sondern für weniger als 0x2c (44) 512-Byte-Einheiten. Und -size 010cwird als (oktal) behandelt -size 8c, eine weitere POSIX-Nichtkonformität.

FreeBSD/DragonFly BSD findUnterstü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, findwenn ein Suffix² vorhanden ist.

sfindoder die findeingebauten Funktionen der bosh-Shell verhalten sich wie die von FreeBSD, außer dass Suffixe nicht case-sensitiv sind und bwEunterstü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 cfü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 cSuffix, also ausschließlich Dezimalzahlen ohne führende Nullen, und berechnen die Einheiten manuell.

Der Vollständigkeit halber sei erwähnt, Ldass sich der Glob-Qualifizierer zsh( kmgtohne Berücksichtigung der Groß-/Kleinschreibung, aber pPfü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_sizeAttribut 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 sfindfür die -XtimePrä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 findsiehe auch ! -newermt -1day(oder 1 day agooder 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 1kes werden alle Dateien mit der Größe ∈[1,1024] aufgelistet, während find . -size 1024cnur Dateien aufgelistet werden, deren tatsächliche Größe genau 1024 Byte beträgt.

verwandte Informationen