【问题标题】:Remove first 3 columns from `ls`?从`ls`中删除前3列?
【发布时间】:2018-08-30 09:24:30
【问题描述】:

如果我这样做 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

我真的很想删除前 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

ls 似乎无法做到这一点。 SO这里还有其他关于删除多列的问题,但不是从一开始就。

【问题讨论】:

  • 你应该看看ParsingLs
  • 为什么要删除这些列?如果要提供一些匿名列表以提供给其他用户,那么您可以使用cut。但是如果你打算在那里解析信息,那么不要以ls 开头——它不是为了那个!
  • Stack Overflow 不是代码编写服务。请出示您的代码。由于 Stack Overflow 向您隐藏了关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example

标签: linux bash awk cut


【解决方案1】:

ls是一个交互工具,其输出为not supposed to be parsed

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

stat -c '%s %y %n' *

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

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

stat --printf '%s\t%Y\t%n\n' *

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

这仍然会在文件名包含换行符的情况下中断,因此根据您计划如何使用此信息,您可能希望在格式字符串的末尾使用 \0 而不是 \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

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

date -d @"$modified" +'%b %d %H:%m'

【讨论】:

  • %y 有点接近ls 的日期格式,但仍然很奇怪。 2017-05-15 11:02:42.388552115 +0200。有没有办法用stat 获得ls 样式的日期格式?
  • ls 中的日期格式没有明确定义,正如我在问题开头链接到的文章中所述。我编辑了我的答案,以展示如何使用 GNU date 来帮助转换格式。
  • 你能用stat显示文件大小吗?
  • @PiotrWasilewicz 大小将以字节为单位报告,但您可以使用此处提到的方法之一unix.stackexchange.com/q/346902/67817$size 转换为您喜欢的任何格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2019-11-09
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多