假设今天是 4 月 8 日,我在 bash 中执行以下操作。
cd /tmp
mkdir hello
touch -d 2015-04-01 hello
然后,假设我想删除 /tmp 中所有早于一天的文件,但不是目录,我执行以下命令:
find /tmp -mtime +1 -delete -type f
如果目录“hello”不是文件,为什么会删除它?
谢谢!
假设今天是 4 月 8 日,我在 bash 中执行以下操作。
cd /tmp
mkdir hello
touch -d 2015-04-01 hello
然后,假设我想删除 /tmp 中所有早于一天的文件,但不是目录,我执行以下命令:
find /tmp -mtime +1 -delete -type f
如果目录“hello”不是文件,为什么会删除它?
谢谢!
find 命令按顺序执行表达式。既然-delete
是 before -type
,-type
就永远不会到达。尝试:
find /tmp -mtime +1 -type f -delete
-mtime ...
。称它们为“选项”是可以理解的,但由于它们不是选项这一事实是问题的原因,因此需要find
仔细研究它们的术语和概念:
-type f
)-delete
)-maxdepth 1
) - 请注意,此类选项与标准选项不同,标准选项甚至必须位于输入路径之前(例如,find -L /tmp ...
)find
中的更细粒度。forfind
,其中所有三个构造都由一个名称调用, primaries ( BSD也 find
只在其页面中使用primaries )。man
-a
( ) 表示逻辑 OR,( )表示否定;括号中的替代形式不符合 POSIX,但受 GNU 和 BSD find 支持。-and
-o
-or
!
-not
-a
)连接。-a
并-o
应用短路(见下文)\(
并\)
改变优先级(\
-转义是为了保护括号不被shell解释)。\(...\)
, !
, -a
,-o
find
相比之下,options不是位置的,但如果它们没有放在测试和操作之前, GNU默认会发出警告。 为了避免警告,并且为了总体上的概念清晰,最好这样做。find
-a
隐含 - 这意味着一旦先前的测试或操作返回 false ,则不会评估后续测试和操作:
find . -false -print # !! -print is NOT executed
-o
同样,如果( ) 表达式的第二个操作数-or
返回 true,则不会执行第一个操作数:
find . -print -o -print # !! 2nd -print is NOT executed