如何显示文件的修改时间?

Arr*_*cal 58 command-line bash scripts

我想要一种方法来查找和打印文件的修改时间,以便在 bash 脚本中使用。

我想出了:

ls -l $filename | cut -d ' ' -f '6-8'
Run Code Online (Sandbox Code Playgroud)

哪些输出:

Jul 26 15:05
Run Code Online (Sandbox Code Playgroud)

虽然我想避免 parsing ls,但将年份放在那里也很有用。

理想情况下,我希望看到类似于date命令默认输出的输出。

Tue Jul 26 15:20:59 BST 2016
Run Code Online (Sandbox Code Playgroud)

还有哪些有用的方法可用?

hee*_*ayl 81

不要使用ls,这是一个工作stat

stat -c '%y' filename
Run Code Online (Sandbox Code Playgroud)

-c让我们获得特定的输出,这里%y将以人类可读的格式获得文件的最后修改时间。要获取自 Epoch 以来的秒数,请使用%Y

stat -c '%Y' filename
Run Code Online (Sandbox Code Playgroud)

如果您也想要文件名,请使用%n

stat -c '%y : %n' filename
stat -c '%Y : %n' filename
Run Code Online (Sandbox Code Playgroud)

设置格式说明符以满足您的需要。检查man stat

例子:

% stat -c '%y' foobar.txt
2016-07-26 12:15:16.897284828 +0600

% stat -c '%Y' foobar.txt
1469513716

% stat -c '%y : %n' foobar.txt
2016-07-26 12:15:16.897284828 +0600 : foobar.txt    

% stat -c '%Y : %n' foobar.txt
1469513716 : foobar.txt
Run Code Online (Sandbox Code Playgroud)

如果你想要像 一样的输出Tue Jul 26 15:20:59 BST 2016,使用纪元时间作为输入date

% date -d "@$(stat -c '%Y' a.out)" '+%a %b %d %T %Z %Y'
Tue Jul 26 12:15:21 BDT 2016

% date -d "@$(stat -c '%Y' a.out)" '+%c'               
Tue 26 Jul 2016 12:15:21 PM BDT

% date -d "@$(stat -c '%Y' a.out)"
Tue Jul 26 12:15:21 BDT 2016
Run Code Online (Sandbox Code Playgroud)

检查date的格式说明符以满足您的需要。也看看man date

  • 除了这个答案之外,请记住,`ls` 在系统间的实现不一致,因此应该_永远_不要_用于任何类型的自动化。相反,在编写脚本时使用诸如 `stat` 和 `find` 之类的命令。 (5认同)
  • 出色的。我不知道这个小宝藏。其中许多在 *nix/linux 环境中尚未被发现。 (2认同)