如何查找在过去24小时内修改但未从隐藏目录中找到的文件并将它们相加

时间:2015-12-24 10:42:04

标签: linux bash command-line centos find

我有以下命令来查找最近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

任何人都知道如何纠正命令。 感谢

1 个答案:

答案 0 :(得分:1)

解决方案

你可以用两种方式写出来:

  1. 4ae1e1上面的评论一样

    find /mnt/naspath -name .snapshot -prune -o \( -type f -mtime 0 -print0 \)
    

    用语言说:

      

    如果name为'.snapshot',则修剪,否则如果type为file并在过去24小时内修改,则-print0

  2. 可选地

    find /mnt/naspath \! \(-name .snapshot -prune\) -type f -mtime 0 -print0
    

    用语言说:

      

    如果没有修剪(如果名称是'.snapshot')并且类型是文件并在过去24小时内修改过,那么-print0

  3. 分析

    好的,要明白,第二次尝试出了什么问题,让我们再看看它

    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'。

    PS:我希望这个解释可以解释你的问题。如果您喜欢这个答案,请不要忘记投票。 : - )