サイズが特定の値の範囲内にあるファイルを削除したい。たとえば、次のファイルリストがあります。
-rw-r--r-- 1 smsc sys 558 Apr 30 13:07 stats.sfe.1.20120430130513.xml.Z
-rw-r--r-- 1 smsc sys 388 Apr 30 15:32 stats.sfe.1.20120430153013.xml.Z
-rw-r--r-- 1 smsc sys 386 Apr 30 15:36 stats.sfe.1.20120430153513.xml.Z
-rw-r--r-- 1 smsc sys 389 Apr 30 15:42 stats.sfe.1.20120430154013.xml.Z
-rw-r--r-- 1 smsc sys 390 Apr 30 16:02 stats.sfe.1.20120430160013.xml.Z
-rw-r--r-- 1 smsc sys 385 Apr 30 16:12 stats.sfe.1.20120430161013.xml.Z
上記のリストから、サイズが86bと90bで異なるファイルのみを削除します。次のコマンドを使用して、サイズが特定の<size>
を超えるファイルを削除できることを知っています。
find . -size +<size>-delete
しかし、サイズが指定された値よりも小さいファイルに境界をもう1つ追加するにはどうすればよいですか?
範囲は単に上限[〜#〜]および[〜#〜]の下限です。 find
spec から:
式[-a]式
プライマリの結合; AND演算子は、2つのプライマリの並置によって暗示されるか、オプションの-a演算子によって明示的にされます。最初の式が偽の場合、2番目の式は評価されません。
したがって、必要なのは、-delete
アクションの前に両方のサイズの範囲を指定することだけです。
2つのプライマリを結合できる明示的なAND
演算子の-a
。この場合、-size
を使用して範囲を作成します。
find . -size +386b -a -size -390b -exec rm -f {} \;
サイズは数値引数であり、オプションで+
および-
を前に付けることができることに注意してください。 man 1 find
から:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
find
に数値が必要な場合は常に、その前に+
記号を付けてこの数値より大きいことを意味するか、-
記号を付けてこの数値より小さいことを示すことができます。これらは厳密な不等式です。+3
および-7
は4、5、または6を意味します。
-size
プライマリでは、サフィックスc
を追加して、数値がバイト数であることを示す必要があります。複数のプライマリを連結して、それらを結合することができます(一部のバージョンでは、それらの間に-a
または-and
を挿入できます)。したがって:
find . -size +385c -size -391c -delete
Zshでは、L
glob qualifier を使用できます。デフォルトの単位はバイトです。 find
のように、文字+
および-
は、厳密な不等式を示します。
rm *(L+385-391)
(上記のコマンドはサブディレクトリに再帰しません。必要な場合は、パターンの前に**/
を追加してください。)
Perl
を使用する1つの方法:
Perl -e '
for ( @ARGV ) {
if ( -s >= 386 && -s _ <= 390 ) {
unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!]
}
}
' *