我计划使用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 ......
答案 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
效率不高,因为它为每个文件运行一个分支。