shell 脚本中的 ls 命令的不同输出

shell 脚本中的 ls 命令的不同输出

我的 Linux 机器出现了奇怪的行为,我想听听你的建议。我想捕获此命令的输出

ls -log /some/directory 

从命令行运行命令结果正常:

-rw-r--r--. 1 22650880 2013-09-09 12:02 file1.txt
-rwxr--r--. 1 20733952 2012-07-09 17:42 file2.txt
-rw-r--r--. 1 31596544 2013-09-09 23:42 file3.txt
-rw-r--r--. 1 15773696 2013-09-10 11:15 file4.txt

awk所以我使用(ls -log /some/directory| awk '{print $6","$4" "$5}' | tr "\n" ";")的最终结果是:

file1.txt,2013-09-09 12:02;file2.txt,2012-07-09 17:42;... 

当我将命令放入 Bash 脚本中时,就会出现问题ls,因为日期被转换了。而不是2013-09-10 11:15结果是9月09日 12:02

我如何才能获取像命令行输出那样的日期?

答案1

的输出ls取决于LANG环境。来自info ls

默认情况下,文件时间戳以缩写形式列出。大多数语言环境使用时间戳(如2002-03-30 23:45'. However, the default POSIX locale uses a date like“Mar 30 2002”)表示非近期时间戳,使用不带年份和时间的日期(如“Mar 30 23:45”)表示近期时间戳。

比较这两个变体:

$ LANG=C ls -log
total 0
-rw-r--r--  1 0 Sep 10 10:34 file1
-rw-r--r--  1 0 Sep 10 10:34 file2
-rw-r--r--  1 0 Sep 10 10:34 file3
-rw-r--r--  1 0 Sep 10 10:34 file4

$ LANG=en_US.utf8 ls -log
total 0
-rw-r--r--  1 0 2013-09-10 10:34 file1
-rw-r--r--  1 0 2013-09-10 10:34 file2
-rw-r--r--  1 0 2013-09-10 10:34 file3
-rw-r--r--  1 0 2013-09-10 10:34 file4

但一如既往,这是一个解析输出的坏主意ls,因为——正如你所见——很容易坏掉。考虑stat改用

for file in *; do
    stat -c "%n,%z;" "$file"
done

您可以在其中更精确地指定您想要的时间戳:

%x     Time of last access
%y     Time of last modification
%z     Time of last change

而且您也不再需要了awk

答案2

您可以使用 ls 命令指定日期格式:

ls -log --time-style="long-iso" /some/directory 

这总是导致相同的日期格式 YYYY-MM-DD。

相关内容