使用-newermt参数时出现无效谓词错误。

7

我正在使用find命令获取指定时间段内的文件,并使用以下命令将其打包成tar文件,

  find /lag/cnn -max-depth 3 -newermt "2013-12-19 00:00" -o -type f -newermt "2013-12-16 00:00" -print0 | 
   xargs -0 tar acf out.tar.gz

但是当我运行这个命令时,出现了以下错误:find: invalid predicate `-newermt'。问题在哪里?我该如何解决?
更新: 我实际上想要做的是, 路径为(使用 ls -lrt /lag/cnn/*/*):
        /lag/cnn/Example1/one/a.tar.gz
        /lag/cnn/Example1/two/a.tar.gz
        /lag/cnn/Example1/three/a.tar.gz
         /lag/cnn/Example2/one/a.tar.gz

我正在使用grep命令来进行Example1操作,得到的列表如下所示,保存在sample.txt文件中:
        /lag/cnn/Example1/one/a.tar.gz
       /lag/cnn/Example1/two/a.tar.gz
       /lag/cnn/Example1/three/a.tar.gz

我想根据时间从此样本文件中打包文件。由于 touch 命令不能应用于文件,我选择了 find 命令。问题是,我需要从根目录开始执行。

          touch /lag/cnn/*/* start -d "2013-12-19 00:00"

肯定不能生效。那么有没有办法在一定时间范围内读取文件并将其打包,或者如何使用touch命令使用-newer选项,在一定时间范围内查找文件。

2个回答

8

您的find版本不支持-newermt谓词,因此您不能使用它。作为解决方法,您可以使用-newer谓词。该谓词需要一个文件作为参考:它将使用该文件的修改日期,而不是绝对修改日期。您可以为此创建适当的“标记文件”,例如:

touch /tmp/mark.start -d "2013-12-19 00:00"
touch /tmp/mark.end -d "2013-12-16 00:00"

然后使用 -newer 条件重写:

find /some/path -newer /tmp/mark.start

顺便提一下,看起来您的条件有误:您使用了两次不同日期的-newermt,在您的示例中这将获取所有比旧日期更新的文件,而忽略新日期。也许您想要做类似这样的事情:
find /some/path -newer /tmp/mark.start ! -newer /tmp/mark.end

最后,如果参数列表太长并导致xargs分割成多个执行,那么你的tar将无法工作,因为所有执行都会重新创建tar文件。相反,你需要使用tar-T标志而不是xargs

find /some/path -print0 | tar acf out.tar.gz --null -T-

我试图从 /lag/cnn///* 路径提取某个日期之间的文件,这就是为什么我使用了 -maxdepth 3。如果我在此路径上运行 ls 命令,我将得到该路径下所有文件的列表,然后我将从中筛选出所需的列表,并在其中查找需要在特定时间之间打包的文件。我需要从根目录执行这些操作。但是 touch 命令对于 /lag/cnn///* 路径无效,或者是否有任何方法可以在不实际进入特定路径的情况下使用 touch 命令? - user2572985
请查看我的更新答案:我将标记放在/tmp/中,但它们可以放在任何地方。在这些示例中,我专注于关键点,因此省略了您的其他参数,例如-maxdepth 3。您可以在这些示例之上添加任何您需要的内容。 - janos
1
@user2572985,我不理解你的更新。里面一个单词也没看懂。而且你错误地使用了我给你的 touch 示例。你应该完全按照我给你的方式使用它。看起来你根本没有理解我写的内容。 - janos

1
查找比“start”新但比“end”旧的文件。
touch /tmp/mark.start -d "2016-02-16 00:00"

touch a -d "2016-02-15 00:01"

touch b -d "2016-02-16 00:01"

touch c -d "2016-02-17 00:00"

touch d -d "2016-02-18 00:00"

touch e -d "2016-02-19 00:01"

touch /tmp/mark.end -d "2016-02-19 00:00"

命令:find . -type f -newer /tmp/mark.start ! -newer /tmp/mark.end

意思:查找在/tmp/mark.start之后但在/tmp/mark.end之前修改过的所有文件。

========================================================================

输出:
-bash-3.2$ find . -type f -newer /tmp/mark.start ! -newer /tmp/mark.end

./d

./b

./c

-bash-3.2$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接