
find
Linuxのコマンドについて質問があります。
オンラインで見つかったすべての記事は、プロパティが-size -10M
サイズが10 MB未満のファイルを返すと言われています。ところでこれをテストしてみると-size -10M
返されるファイルサイズが9MB以下のようです。
もし私がするなら
find . -type f -size -1M
このfind
コマンドは空のファイルのみを返します(単位は無関係で、-1G、-1k...の場合があります)。
find . -type f -size -2M
サイズが1M未満のファイルを返します。
マニュアルページには次のように記載されています。
寸法は次の単位に丸められます。したがって、-size -1M は -size -1048576c と同じではありません。前者は空のファイルのみと一致し、後者は0から1,048,575バイトのファイルと一致します。
さて、それでは-1Mは0Mに丸められ、-2Mは-1Mに丸められるようですね…?
しかし、その後
find . -type f -size 1M
<= 1M(例:100Kおよび512Kファイル、空のファイルではない)ファイルを返しますが、正確に1Mサイズのファイルを返したいと思います。
find . -type f -size 2M
>1Mや<=2Mなどのファイルを返します。
これが正常ですか、それとも私が何か間違っているのですか?パラメータの正確な動作は何ですか-size
?
答え1
GNU find のマニュアルページは次のとおりです。これはGNU findに固有のものであり、他の実装は異なる場合があります。下記をご覧ください。
いつものように、+と-の接頭辞は、より大きいとより小さいことを示します。つまり、n 単位の正確なサイズが一致しません。寸法は次の単位に丸められます。したがって、同じでは
-size -1M
ありません-size -1048576c
。前者は空のファイルのみと一致し、後者は0〜1,048,575バイトのファイルと一致します。
質問:
さて、それでは-1Mは0Mに丸められ、-2Mは-1Mに丸められるようですね…?
-size
いいえ。丸め条件は制限ではなく、ファイルサイズ自体です。
1234バイトのファイルと-size -1M
コマンドをインポートします。ファイルサイズは、説明書に記載されている最も近い単位(ここではMB)に丸められます。 1234B - > 1MB。-size -1M
要件を満たしていないため適していません。未満1MB(丸め)。したがって、実際には空のファイルのみが返されます。-size -1x
x
上記のファイルは、-size 1M
丸め後のサイズが正確に1 MBであるため、一致します。 (サイズが1Bから1048576Bのすべてのファイルと一致します。)一方、-size 1k
1234Bは2kBに丸められるため、一致するものはありません。
条件では、数字の前後に丸め-
動作+
とは関係ありません。
丸めの問題が発生しないように、常にサイズをバイト単位で指定すると便利です。-size -$((1024*1024))c
サイズが1MB(または必要に応じて1MiB)未満のファイルを確実に見つけます。たとえば、範囲が必要な場合は、( -size +$((512*1024-1))c -size -$((1024*1024+1))c )
[512kB、1024kB]内のファイルを使用できます。
これに関するもう一つの質問は次のとおりです。「find -size -1G」がファイルを見つけられないのはなぜですか?
関連質問で言及されているGilles実はPOSIX は次のように指定します。 -size N
as は 512 バイトのブロック単位のサイズを表します (上記のように丸められます: "ファイルのサイズ (バイト単位)、512 で除算し、次の整数に丸められます")。 asはサイズ(バイト単位)を表します。どちらもオプションのプラス記号またはマイナス記号が付属しています。他のものは指定されておらず、すべての実装が他のプレフィックスを認識していないか、GNU findのように丸めます。-size Nc
find
MacでBusyboxと* BSD findでテストした結果、より合理的に感じられるようにサイズ指定子を使用して条件を処理するようです。つまり、-size -1k
0 から 1023 バイトまでのファイル一致、 と同じ-size -1024c
、-size -1M
== も同様です-size -1024k
(Busybox のみ) c
、b
とk
)。その後、POSIXテキストで言うのとは異なり、Busyboxはブロックで指定されたサイズに対して丸められないようです。
したがって、YMMVもサイズをバイト単位で維持する方が良いかもしれません。
-atime
-mtime
と条件にも同様の問題があります-ctime
。
-atime n
ファイルはn * 24時間前に最後にアクセスされました。 findが24時間前に最後にファイルにアクセスした期間を計算すると、小数部は無視されます。したがって、一致するには、-atime +1
ファイルに少なくともアクセスしたことが必要です。二つ数日前。
同様に、-amin +$((24*60-1))
この機能を使用して、少なくとも24時間前に最後にアクセスしたファイルを見つけるのが簡単になります。 (1分に増やすと外れません。)
また見なさい:find -mtime +1が2日前のファイルのみを返すのはなぜですか?
これは正常ですか、それとも私が何か間違っているのですか? -sizeパラメータの正確な動作は何ですか?
これはGNU findの動作の面では「正常」ですが、完全に合理的ではありません。混乱しているのは間違っているのではなく、find
混乱しているだけです。
答え2
find
マニュアルセクションへの回答-size
:
いつものように、+と-の接頭辞は、より大きいとより小さいことを意味します。つまり、n 単位の正確なサイズが一致しません。覚えておいてください、サイズは次の単位に丸められます。。 だから - サイズ - 1M-size -1048576c と同じではありません。以前の空のファイルのみ一致、後者は0から1,048,575バイトまでのファイルと一致します。
したがって、言及されているすべてのケースに質問があります。サイズパラメータと比較する前に、サイズを最も近い単位に丸めます。。-size
単位が「M」の場合は、すべてメガバイトに丸められます。