linux - 从 `ls` 中删除前 3 列?

标签 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

我真的想删除前 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 上还有其他关于删除多列的问题,但不是从一开始就删除。

最佳答案

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'

关于linux - 从 `ls` 中删除前 3 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49403267/

相关文章:

linux - 通过 nohup 检查是否成功启动

linux - 如何为 Qt 应用程序创建 'install' 包?

c - 使用原始套接字从 recvfrom 获取数据

linux - 如何在grep中传递多个变量

bash - 相当于命令行中的 exit

linux - 如何从 bash 获取平均 CPU 温度?

bash - awk,从文件中提取特定值

linux - 使用 awk 追加到文件的特定行,保留不匹配的行不变

linux - 使用 awk 脚本语言循环遍历多行字符串

python - 在 python 字符串中获取控制台输出