我有以下命令来查找最近24小时内修改过的文件并将它们全部加起来。
#!/bin/bash
find /mnt/naspath -mtime 0 -print0 | du --files0-from=- -hc | tail -n1 >> /tmp/size.log
exit 0
然而,它还将.snapshot
我在查找手册页中看到的是我可以排除.snapshot
以及我不太清楚的以下内容。
#!/bin/bash
find . -name .snapshot -prune -o \( \! -name *~ -print0 \)
所以现在我希望用以下命令排除hidden和sum修改后的文件,但这完全相反。它排除.snapshot
但总结其余部分。 -mtime 0
未受影响。
#!/bin/bash
find /mnt/naspath -mtime 0 -name .snapshot -prune -o \( \! -name *~ -print0 \) | du --files0-from=- -hc | tail -n1 >> /tmp/size.log
exit0
任何人都知道如何纠正命令。 感谢
答案 0 :(得分:1)
你可以用两种方式写出来:
与4ae1e1上面的评论一样
find /mnt/naspath -name .snapshot -prune -o \( -type f -mtime 0 -print0 \)
用语言说:
如果name为'.snapshot',则修剪,否则如果type为file并在过去24小时内修改,则
-print0
可选地
find /mnt/naspath \! \(-name .snapshot -prune\) -type f -mtime 0 -print0
用语言说:
如果没有修剪(如果名称是'.snapshot')并且类型是文件并在过去24小时内修改过,那么
-print0
好的,要明白,第二次尝试出了什么问题,让我们再看看它
find /mnt/naspath -mtime 0 -name .snapshot -prune -o \( \! -name *~ -print0 \)
首先,我们通过find解释它(即插入隐式-and
并尊重运算符优先级(...)
> \!
> -and
> -or
)。这导致:
find /mnt/naspath \( \
\( -mtime 0 -and -name .snapshot \) -and -prune \
\) -or \( \
\( \! -name *~ \) -and -print0 \
\)
\
仅用于转义。现在这更容易理解 - 用文字:
任何匹配
-mtime 0 -and -name .snapshot
的路径都将被修剪(例如,在目录的情况下,跳过而不是后退)。对于与-name *~
不匹配的所有其他内容-print0
。
很明显,这与您的意图不符,因为您只想修剪名为.snapshot
的修改时间的路径。导致此不同结果的主要原因是-prune
命令的放置和运算符优先级的规则。相反,过滤器-mtime 0
应该应用于未修剪的所有内容。最后但并非最不重要的是,过滤器\! -name *~
没有执行您想要的任何操作,而是需要一个额外的过滤器-type f
来从最终计数中排除目录。
注意:表达式-name .snapshot -prune
应该是要执行的第一个表达式。
例如,-type f \! \(-name .snapshot -prune\)
代替\! \(-name .snapshot -prune\) -type f
会导致名为.snapshot
的非文件的行为不同,就像您的案例中的目录一样。只要-type f
评估为false,find就会停止评估下一个表达式(因为它隐式地与-and
链接,这将永远不会成立)。在这两种情况下,最终结果都是假的,但在第一种情况下不会执行修剪,这意味着不会阻止后续进入'.snapshot'。