我想删除大小在特定值之间的文件。例如,我有以下文件列表:
-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
从上面的列表中,我只想删除大小不同的文件386b和390b。我知道我可以使用以下命令来删除大小超过一定值的文件<size>
:
find . -size +<size>-delete
但是如何为大小小于给定值的文件添加一个边界呢?
答案1
是-a
一个显式AND
运算符,允许您连接两个原色。在本例中使用创建范围-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.
答案2
每当find
需要一个数字时,您可以在+
其前面添加一个符号以表示大于此数字,或在其前面添加一个-
符号以表示小于此数字。这些是严格的不等式:+3
和-7
表示 4、5 或 6。
对于-size
primary,您需要添加后缀c
以指示该数字是字节数。您可以连接多个原色以获取它们的连接(在某些版本中,您可以在它们之间放置-a
或-and
)。因此:
find . -size +385c -size -391c -delete
在 zsh 中,您可以使用L
全局限定符。默认单位是字节;像、和 等find
字符表示严格的不等式。+
-
rm *(L+385-391)
(上面的命令不会递归到子目录;如果需要,请**/
在模式之前添加。)
答案3
范围只是一个上限和下限。来自find
规格:
表达式 [-a] 表达式
初选的结合; AND 运算符由两个原色的并置隐含或通过可选的 -a 运算符明确表示。如果第一个表达式为 false,则不应计算第二个表达式。
因此,您需要做的就是在-delete
操作之前指定两个大小范围。
答案4
一种使用方法perl
:
perl -e '
for ( @ARGV ) {
if ( -s >= 386 && -s _ <= 390 ) {
unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!]
}
}
' *