web-dev-qa-db-ja.com

特定のサイズ範囲のファイルを削除する

サイズが特定の値の範囲内にあるファイルを削除したい。たとえば、次のファイルリストがあります。

-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

上記のリストから、サイズが86b90bで異なるファイルのみを削除します。次のコマンドを使用して、サイズが特定の<size>を超えるファイルを削除できることを知っています。

find . -size +<size>-delete

しかし、サイズが指定された値よりも小さいファイルに境界をもう1つ追加するにはどうすればよいですか?

12
Eugene S

範囲は単に上限[〜#〜]および[〜#〜]の下限です。 find spec から:

式[-a]式

プライマリの結合; AND演算子は、2つのプライマリの並置によって暗示されるか、オプションの-a演算子によって明示的にされます。最初の式が偽の場合、2番目の式は評価されません。

したがって、必要なのは、-deleteアクションの前に両方のサイズの範囲を指定することだけです。

7
jw013

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.
8
George M

findに数値が必要な場合は常に、その前に+記号を付けてこの数値より大きいことを意味するか、-記号を付けてこの数値より小さいことを示すことができます。これらは厳密な不等式です。+3および-7は4、5、または6を意味します。

-sizeプライマリでは、サフィックスcを追加して、数値がバイト数であることを示す必要があります。複数のプライマリを連結して、それらを結合することができます(一部のバージョンでは、それらの間に-aまたは-andを挿入できます)。したがって:

find . -size +385c -size -391c -delete

Zshでは、Lglob 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 $_: $!] 
        } 
    }
' *
1
Birei