从 `ls` 中删除前 3 列?

Lou*_*ise 0 linux bash awk cut

如果我这样做ls -o,我得到

-rw-rw-r-- 1 louise     347967 Aug 28  2017 Screenshot from 2017-08-28 09-33-01.png
-rw-rw-r-- 1 louise     377739 Aug 29  2017 Screenshot from 2017-08-29 10-39-49.png
-rw-rw-r-- 1 louise     340682 Aug 29  2017 Screenshot from 2017-08-29 10-40-02.png
Run Code Online (Sandbox Code Playgroud)

我真的想删除前 3 列,所以我得到

347967 Aug 28  2017 Screenshot from 2017-08-28 09-33-01.png
377739 Aug 29  2017 Screenshot from 2017-08-29 10-39-49.png
340682 Aug 29  2017 Screenshot from 2017-08-29 10-40-02.png
Run Code Online (Sandbox Code Playgroud)

ls不能这样做,似乎。这里还有其他关于删除多列的问题,但不是从一开始。

Tom*_*ech 5

ls是一个交互式工具,其输出不应被解析

考虑使用替代工具,例如stat(推荐 GNU 版本):

stat -c '%s %y %n' *
Run Code Online (Sandbox Code Playgroud)

输出并不完全相同,但您可以完全控制格式。stat --help提供有关可能的格式序列的更多信息。

使用 GNU stat,您还可以使用--printf在格式字符串中添加换行符或制表符等转义字符,以使解析更容易:

stat --printf '%s\t%Y\t%n\n' *
Run Code Online (Sandbox Code Playgroud)

%Y(最后一次修改,自 Epoch 以来的秒数)比%y(人类可读的)更适合解析。

如果文件名包含换行符,这仍然会中断,因此根据您计划如何使用此信息,您可能希望在格式字符串的末尾使用 a\0而不是 a\n并处理以空字节结尾的记录的换行符。

或者,您可能会发现循环遍历文件并stat一个一个调用它们更容易,提取您需要的任何内容:

for file in *; do
    read -r size modified name < <(stat '%s %Y %n' "$file")
    # do whatever with $size, $modified and $name here
done
Run Code Online (Sandbox Code Playgroud)

假设您使用基于循环的方法,您可以使用 将日期转换为您想要的任何格式date,例如:

date -d @"$modified" +'%b %d %H:%m'
Run Code Online (Sandbox Code Playgroud)

  • `ls` 中的日期格式没有明确定义,正如我在问题开头链接的文章中所述。我编辑了我的答案以展示如何使用 GNU `date` 来帮助转换格式。 (2认同)