【问题标题】:Find files older than FILE without including FILE查找早于 FILE 的文件而不包括 FILE
【发布时间】:2012-12-12 11:34:09
【问题描述】:

我计划使用find 为我提供比某些 FILE 更旧的文件列表,然后使用xargs(或-exec)将文件移动到其他位置。搬东西不是问题; | xargs mv {} ~/trash 工作正常。

现在,如果我尝试使用! -newer FILE,那么FILE 会包含在列表中,这是我不想要的!

该命令参数的功能确实在逻辑上有意义,因为“不新”可以很好地解释为“相同或旧”,如下所示:

$ find . ! -newer Selection_008.png -exec ls -l {} \;

包含来自比较参数的文件:

-rw-r--r-- 1 and and 178058 2012-09-24 11:46 ./Selection_004.png
-rw-r--r-- 1 and and 16260 2012-09-21 11:25 ./Selection_003.png
-rw-r--r-- 1 and and 38329 2012-10-04 17:13 ./Selection_008.png
-rw-r--r-- 1 and and 177615 2012-09-24 11:53 ./Selection_005.png

ls -l 仅显示日期以作说明)

我真正需要find 提供的是-older 选项,但find(1) 中没有列出...

当然,可以只通过grep -v 管道输出,使用sed 等,或者使用环境变量来重用文件名(fx. for grep -v)这样我就可以享受 DRY 原则, 喜欢

$ COMP=Selection_008.png find . ! -newer $COMP | grep -v $COMP | xargs ...

但是对于一个单行者来说,这似乎是很多写作,而这不是我想要的。

有没有比find 更短/更简单的方法,还是我错过了一些选择?我检查了手册页,并搜索了 Google 和 SO...

【问题讨论】:

    标签: shell find


    【解决方案1】:

    你可以试试这个:

    find . ! -newer $COMP ! -name $COMP
    

    【讨论】:

    • 这还不错,它节省了一个管道。然而,它也让我输入更多的东西,包括。设置 env.var。我真的很想避免。当然,在脚本中就可以了:)
    【解决方案2】:

    完全是-older,但! -samefile 将排除特定文件。

    $ find . ! -newer Selection_008.png ! -samefile -exec ls -l {} \;
    

    这仍然会捕获一个与文件年龄完全相同的文件,并且因为它是基于 inode 的, 处理链接时也可能有一些注意事项。

    【讨论】:

      【解决方案3】:

      Find 似乎不支持这一点。您可以将测试委托给test

      find . -exec test "{}" -ot "$COMP" \; -print
      

      效率不高,因为它为每个文件运行一个 fork。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-11
        • 2020-11-20
        • 1970-01-01
        • 2020-12-22
        • 1970-01-01
        • 2020-02-04
        • 2013-02-03
        • 2012-12-11
        相关资源
        最近更新 更多