查找早于FILE的文件而不包括FILE

时间:2012-12-12 11:34:10

标签: shell find

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

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

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

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

包含compare参数中的文件:

-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。用于grep -v)所以我可以享受DRY原则,比如

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

但它似乎只是为一个oneliner写了很多,这不是我想要的。

是否有比find更短/更简单的方法,还是我错过了一些选项?我查看了联机帮助页,并搜索了Google和SO ......

3 个答案:

答案 0 :(得分:4)

你可以试试这个:

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

答案 1 :(得分:4)

不完全 -older,但! -samefile会排除特定文件。

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

这仍然会捕获与文件年龄完全相同的文件,因为它是基于inode的, 也可能有处理链接的警告。

答案 2 :(得分:1)

查找似乎不支持此功能。您可以将测试委托给test

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

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