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

DGA*_*DGA 3 linux bash command-line

我的 linux 机器上有一个奇怪的行为,我需要你的建议。我想捕获此命令的输出

ls -log /some/directory 
Run Code Online (Sandbox Code Playgroud)

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

-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
Run Code Online (Sandbox Code Playgroud)

所以我使用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;... 
Run Code Online (Sandbox Code Playgroud)

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

如何在命令行输出中获取日期?

mpy*_*mpy 5

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

默认情况下,文件时间戳以缩写形式列出。大多数语言环境使用像2002-03-30 23:45'. However, the default POSIX locale uses a date likeMar 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
Run Code Online (Sandbox Code Playgroud)

但是,与往常一样,解析 的输出ls是一个坏主意,因为——正如您所看到的——很容易中断。考虑stat改用

for file in *; do
    stat -c "%n,%z;" "$file"
done
Run Code Online (Sandbox Code Playgroud)

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

%x     Time of last access
%y     Time of last modification
%z     Time of last change
Run Code Online (Sandbox Code Playgroud)

你也不需要awk了。