3

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

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

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

$ 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、 usesed等管道输出,或者利用环境变量来重用文件名(fx. for grep -v),这样我就可以享受 DRY 原则,比如

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

但这似乎是一个单行者的大量写作,而这不是我想要的。

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

4

3 回答 3

4

你可以试试这个:

find . ! -newer $COMP ! -name $COMP
于 2012-12-12T11:51:44.507 回答
4

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

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

这仍然会捕获一个与文件年龄完全相同的文件,并且由于它是基于 inode 的,因此也可能存在处理链接的警告。

于 2014-03-02T02:28:40.560 回答
1

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

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

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

于 2012-12-12T12:22:48.283 回答