该find命令有一个方便的-printf操作符,可以为每个找到的文件/文件夹打印用户指定的元数据。该命令有这样的选项吗ls?
作为替代方案,我可以将感兴趣的文件名列表提供给
find而不是ls,但这似乎就像在飞行中使用大锤一样。我已经有了感兴趣的文件,但我并没有真正“找到”任何东西。
此外,提供路径find会很棘手,因为我不能只将所需的文件路径附加到命令的末尾find
。该find命令要求路径位于运算符(或“谓词”)之前。因此,我无法轻松利用“xargs”。
感谢Steeldriver的回答。我认为stat如果我从头开始,他的使用将是一个解决方案。find不幸的是,我必须将输出与其他系统(特别是使用's )生成的类似信息进行比较printf。
以下是一些find我发现有效的代码习惯用法:
# Option 1
Some Command \
| xargs -n 1 -I{} find {} -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
# Option 2
Some Command | tr '\n' '\0' \
| xargs -0 -I{} find {} -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
Run Code Online (Sandbox Code Playgroud)
根据muru 的评论,这是一个我尚未使用的代码习惯用法,因为我的findCygwin 的 Gnu 版本早于 4.9 并且无法识别谓词-files0-from:
Some Command | tr '\n' '\0' \
| find -files0-from - -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
Run Code Online (Sandbox Code Playgroud)
ls据我所知,\xc2\xb9的 GNU 实现并非如此,但是stat.
例如,stat来自 GNU Coreutils,stat --printf \'%n\\t%y\\t%s\\n\'将为您提供所需的字段和分隔符,尽管它(据我所知)没有提供日期时间格式\xc2\xb2 的细粒度控制。
但是,如果zsh是一个选项,您可以使用zsh/stat Module,也许可以使用您想要的确切输出定义您自己的 shell 函数:
zmodload -F zsh/stat b:zstat\n\nmystat () {\n local f s ret=0\n for f do\n zstat -n -LF \'%Y-%m-%d %H:%M\' -H s -- $f &&\n printf \'%s\\t%s\\t%s\\n\' $s[name] $s[mtime] $s[size] ||\n ret=$?\n done\n return $ret\n}\nRun Code Online (Sandbox Code Playgroud)\n或者,您可以使用简单的 perl 脚本使用其lstat 函数来执行您想要的操作,例如
\nmystat() {\n perl -MPOSIX -E \'\n foreach $f (@ARGV) { \n if (@s = lstat($f)) {\n say join "\\t", $f, strftime("%Y-%m-%d %H:%M", localtime($s[9])), $s[7];\n } else {\n warn "$f: $!\\n";\n $ret = 1;\n }\n }\n exit $ret;\n \' -- "$@"\n}\nRun Code Online (Sandbox Code Playgroud)\n无论如何,这-printf是特定于 GNU 实现的find(尽管在stat添加 GNU 命令之前就已经存在了几十年)。使用 GNU find4.9 或更高版本,您可以使用谓词可靠地传递任意路径列表-files0-from:
mystat() {\n [ "$#" -eq 0 ] ||\n printf \'%s\\0\' "$@" |\n find -files0-from - -prune -printf \'%p\\t%TY-%Tm-%Td %TH:%TM\\t%s\\n\'\n}\nRun Code Online (Sandbox Code Playgroud)\n在任何情况下,请注意 TAB 和 NL 与文件路径中的任何字符一样有效,因此无法可靠地解析输出(可以简化的时间戳格式%F %R也是不明确的,因为它缺少时区信息)。
所有这些都lstat()对文件执行 a 操作,以便对于符号链接类型的文件,它们报告有关符号链接本身的信息,而不是它们最终解析到的文件的信息。要stat()改为执行此操作(并在符号链接解析后报告信息),请将选项添加-L到 GNUstat或 GNU find,从 zsh stat 中删除它,删除-Past-open\'s 选项ls,并lstat在脚本stat中替换为perl。
\xc2\xb9 ast-open实现虽然使用(与标准命令ls -PdZ \'%(name)s\\t%(mtime:time=%Y-%m-%d %H:%M)s\\t%(size)s\' -- "$@"相同的语法),但据我所知,该实现已不再维护。pax
\xc2\xb2 GNUstat在调用的文件上也会失败-,因为它将其解释为fstat()在 stdin 上执行 a 的意思;zsh stat(比 GNU 早几年)不存在这个问题,并且可以对任意文件描述符-f FD执行 a 操作。fstat()