"find -ls"具有适当的时间风格

Den*_*nno 7 linux bash ls find datetime-format

我使用以下命令生成一个文件列表,我有时会比较以查看是否有更改:

find /directory -xdev -ls
Run Code Online (Sandbox Code Playgroud)

我的问题是输出中的时间并不总是以相同的格式:

Sep 19 08:48 ./pool/f/f/0/ff046cc5b7188073cbd68207c52bddc5
Nov  2 06:24 ./pool/f/f/0/ff0e803c36d89315a6b3663ed1295f71
Jan 18  2012 ./pool/f/f/0/ff07f60465d8deb7a1aa38096d0b798d
Jan 18  2012 ./pool/f/f/0/ff07436f519bddf1d340afde5a240375
Run Code Online (Sandbox Code Playgroud)

对于ls-command,有一个选项--time-format = long-iso来强制所有文件使用相同的时间格式.是否可以将其与find-command组合使用?

谢谢

Ken*_*Ken 8

您可以使用-printf的各种选项(手动查找)

find . -printf "%CY-%Cm-%Cd %CH:%CM\n"
Run Code Online (Sandbox Code Playgroud)


Dav*_* W. 7

我的联机帮助页中没有任何有关更改 -ls参数格式的内容。事实上,在我的系统上, 的输出-ls不受影响命令本身输出的各种环境变量的影响ls。我假设参数的格式-ls是内部的find并且不涉及实际的ls命令。对我来说,这让编程变得有意义。为什么要运行外部命令?只需模拟显示即可。

\n

我能想到的解决这个问题的唯一方法是使用-exec-print0将结果传递给实际ls命令。一点警告:如果您传递目录的名称,ls将打印该目录的内容,因此您需要传递-dls命令或添加-type ffind查询中。我检查了 Linux 上 find 的联机帮助页,发现它的输出应该与 相同-dils,所以我使用了它。由于-d包含在内,我不必添加type -f到我的查找查询中:

\n

这是使用-exec它将每个文件或目录单独发送到ls命令。如果有10,000个文件,ls就会被调用10,000次。

\n
$ find /directory -xdev -exec ls -dils --time-style=long-iso {} \\;\n
Run Code Online (Sandbox Code Playgroud)\n

这可能更有效:

\n
$ find /directory -xdev -print0 | xargs -0 ls -dils --time-style=long-iso\n
Run Code Online (Sandbox Code Playgroud)\n

这会将尽可能多的文件名分组到命令缓冲区中,并将它们立即传递给命令ls。它将ls根据需要多次调用该命令以完成所有文件。例如,如果find命令中有 10,000 个文件,则该ls命令可能会被调用一次或两次,而不是 10,000 次。

\n

问题是xargs存在有趣的文件名问题,并且存在一些安全问题,如联机帮助页中指出的:

\n
\n

xargs 不可能安全地使用,因为输入文件列表的生成与 xargs 发出的命令中的使用之间始终存在时间间隔。如果其他用户有权访问系统,他们可以在此时间窗口内操纵文件系统,以强制 xargs 运行的命令的操作应用于您不希望的文件。有关此问题及相关问题的更详细讨论,请参阅 findutils Texinfo 文档中的 \xe2\x80\x98\xe2\x80\x98Security 注意事项\xe2\x80\x99\xe2\x80\x99 章节。find 的 -execdir 选项通常可以用作更安全的替代方案。

\n
\n

-print0参数使用NUL字符而不是 a 来分隔文件名NL,并且该-0参数告诉xargs使用该NUL字符作为文件名分隔符而不是空格(环境变量中的字符$IFS)。

\n

-print0 | xags -0这意味着几乎所有时间都使用works,但您可能仍然认为这-exec ls是更好的方法。

\n