我的 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。