删除一定大小范围的文件


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

但是,如何为小于给定值的文件添加一个边界?


4
find默认情况下,逻辑上将对条件进行“与”运算,因此只需-size为另一个界限添加另一个选项即可。
2012年

@ jw013太好了!这对我行得通。谢谢!请张贴它作为您的答案,我会接受。
尤金·S

Answers:


7

范围只是一个上限一个下限。从find规格

表达[-a]表达

初选的结合;两个原语的并置暗含AND运算符,或由可选的-a运算符明确表示AND运算符。如果第一个表达式为假,则不计算第二个表达式。

因此,您需要做的就是在-delete操作前指定两个大小范围。


8

-a一个显式AND运算符中的,该运算符使您可以结合两个主变量。在这种情况下,请使用创建范围-size

find . -size +386b -a -size -390b -exec rm -f {} \;

请注意,size是一个数字参数,可以选择在+和之前加上数字-。来自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运算。所以我只添加了一个size条件,它工作正常!最终命令如下:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene 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。您能解释一下吗?
Hashim

1

一种使用方式perl

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

谢谢您的回答!这部分代码应单行输入吗?
Eugene S

@EugeneS:是的。它应该按原样粘贴在您的命令行中,或者将所有行合并为一个。
Birei 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.