将 ls -l 输出格式化为管道分隔文件

将 ls -l 输出格式化为管道分隔文件

我对 Unix 相当陌生,需要一些帮助。当我执行ls -l命令(实际上ls -alR)并将输出通过管道传输到文件中时,会使用空格来分隔返回的 ls 字段。我想要实现的本质是通过制表符或管道字符(都应该有效)来分隔 ls 字段。我开始查看pr命令并用制表符替换空格,但这不起作用,因为 ls 输出中有不同数量的空格,这导致导入此文件时出现错误字段。

答案1

如果您稍后要解析此输出,我会阻止它。看这一页以便更好地描述原因。无论如何,使用 获取所需的信息都将非常困难ls,特别是在文件名中存在空格或其他特殊字符的情况下。如果您只想构建 csv 或其他内容,更好的选择是使用-printf以下命令的选项find. :此命令应该可以帮助您开始:

find . -printf "%M|%n|%u|%s|%P\n" > output

请注意,这将从起始目录开始递归,就像您的ls命令一样。它将权限、链接计数、所有者、组、大小和文件名转储到一个文件中,其中的字段由管道分隔。查看手册页以find获取更多信息。

答案2

你可以不用费力去解析 ls仿真 ls -l使用 GNU coreutilsstat命令,使用您选择的格式。如果您在 bash shell 上使用 globstar 选项来递归列出文件,并使用 dotglob 选项来列出点文件,那么您可以获得相当合理的结果。对于文件修改时间,我选择使用%Y,即“自纪元以来的秒数”;您可以使用%y,甚至将 %Y 值传递给 来date重新格式化它,无论您选择什么。使用自纪元以来的秒数是一种非常灵活的方法,可以让下游处理器随心所欲地显示它。

对于一个简单的文件:

$ stat -c "%A|%h|%U|%G|%s|%Y|%n" hosts.txt
-rw-r--r--|1|username|pgrp|135387|1202230643|hosts.txt

模仿ls -alR

$ shopt -s globstar dotglob
$ stat -c "%A|%h|%U|%G|%s|%Y|%n" **
drwxr-xr-x|2|username|pgrp|4096|1510073497|.dotdir
-rw-r--r--|1|username|pgrp|0|1510073497|.dotdir/.dotfile
-rw-r--r--|1|username|pgrp|0|1507213776|f/test case
-rw-r--r--|1|username|pgrp|0|1507213776|f/test case.csv
-rw-r--r--|1|username|pgrp|135387|1202230643|hosts.txt
drwxr-xr-x|2|username|pgrp|4096|1510073307|space dir
-rw-r--r--|1|username|pgrp|0|1510073307|space dir/space file
-rwxr-xr-x|1|username|pgrp|112|1510073163|stat.sh

虽然这可能不太便携(对于没有 coreutils / stat 的系统),但它确实具有灵活的优点,可以仅打印您感兴趣的字段,并且不会冒险替换文件名中的空格。

答案3

只需添加以下内容:

ls -alR |  sed -r s'/\s+/|/g'

这应该适用于您想要修改其输出的任何命令。 \s 代表“空格”,“+”代表一次或多次出现(因此它会匹配制表符”,然后“|”是我们用于新分隔符的符号。请记住,有一些如果您喜欢制表符,则应使用“\”转义特殊字符,如下所示:

 ls -alR |  sed -r s'/\s+/\t/g'

相关内容