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


12

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

-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

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

find . -size +<size>-delete

しかし、どのようにしてサイズが所定の値より小さいファイルにもう1つの境界を追加できますか?


4
find条件はデフォルトで論理的にANDされている-sizeため、もう一方の境界の別のオプションを追加するだけです。
jw013

@ jw013素晴らしい!それは私のために働く。ありがとう!回答として投稿してください。受け入れます。
ユージンS

回答:


7

範囲は単に上限である下限。find仕様から:

式[-a]式

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

そのため、-deleteアクションの前に両方のサイズの境界を指定するだけです。


8

-a明示的でAND使用すると、2つの原色をconjoinすることができます演算子。この場合、を使用して範囲を作成します-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.

ご回答ありがとうございます。ただし、彼のコメントで@ jw013が言及したように、find条件はデフォルトで論理的にANDされます。したがって、もう1つのsize条件を追加しただけで、正常に機能しました。最後のコマンドは次のようになりますfind . -maxdepth 1 -size +358c -size -395c -delete
ユージンS

7

find数字を期待するときはいつでも+、この数字よりも大きいことを意味する-記号、またはこの数字よりも小さい記号を置くことができます。これらは厳密な不等式で+3あり-7、4、5、または6 を意味します。

では-size主、あなたは接尾辞を追加する必要があるc数がバイト数であることを示すために。複数のプライマリを連結して、それらの論理積をとることができます(一部のバージョンでは、それらを配置し-aたり-and、それらの間に配置したりできます)。したがって:

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

zshでは、L glob修飾子を使用できます。デフォルトの単位はバイトです。のようfindに、文字+-は厳密な不等式を示します。

rm *(L+385-391)

(上記のコマンドはサブディレクトリに再帰しません。必要な場合は**/、パターンの前に追加してください。)


+3と-7が4、5、6に等しいことを理解していません。説明してもらえますか?
ハシム

1

を使用する1つの方法perl

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *

ご回答ありがとうございます!コードのこの部分は1行で入力する必要がありますか?
ユージンS

@EugeneS:はい。コマンドラインにそのまま貼り付けるか、すべての行を1つに結合して機能するはずです。
ビレイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.