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组合使用?
谢谢
您可以使用-printf的各种选项(手动查找)
find . -printf "%CY-%Cm-%Cd %CH:%CM\n"
Run Code Online (Sandbox Code Playgroud)
我的联机帮助页中没有任何有关更改 -ls
参数格式的内容。事实上,在我的系统上, 的输出-ls
不受影响命令本身输出的各种环境变量的影响ls
。我假设参数的格式-ls
是内部的find
并且不涉及实际的ls
命令。对我来说,这让编程变得有意义。为什么要运行外部命令?只需模拟显示即可。
我能想到的解决这个问题的唯一方法是使用-exec
或-print0
将结果传递给实际ls
命令。一点警告:如果您传递目录的名称,ls
将打印该目录的内容,因此您需要传递-d
给ls
命令或添加-type f
到find
查询中。我检查了 Linux 上 find 的联机帮助页,发现它的输出应该与 相同-dils
,所以我使用了它。由于-d
包含在内,我不必添加type -f
到我的查找查询中:
这是使用-exec
它将每个文件或目录单独发送到ls
命令。如果有10,000个文件,ls
就会被调用10,000次。
$ 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 次。
问题是xargs
存在有趣的文件名问题,并且存在一些安全问题,如联机帮助页中指出的:
\n\nxargs 不可能安全地使用,因为输入文件列表的生成与 xargs 发出的命令中的使用之间始终存在时间间隔。如果其他用户有权访问系统,他们可以在此时间窗口内操纵文件系统,以强制 xargs 运行的命令的操作应用于您不希望的文件。有关此问题及相关问题的更详细讨论,请参阅 findutils Texinfo 文档中的 \xe2\x80\x98\xe2\x80\x98Security 注意事项\xe2\x80\x99\xe2\x80\x99 章节。find 的 -execdir 选项通常可以用作更安全的替代方案。
\n
该-print0
参数使用NUL
字符而不是 a 来分隔文件名NL
,并且该-0
参数告诉xargs
使用该NUL
字符作为文件名分隔符而不是空格(环境变量中的字符$IFS
)。
-print0 | xags -0
这意味着几乎所有时间都使用works,但您可能仍然认为这-exec ls
是更好的方法。
归档时间: |
|
查看次数: |
11640 次 |
最近记录: |