将修改时间从 stat 转换为时间戳

将修改时间从 stat 转换为时间戳

我刚刚开始学习 Bash 脚本,我写了一个小脚本,将某些文件复制到我的 USB 记忆棒和外部硬盘上作为备份。到目前为止,它会复制整个目录的所有文件,包括那些我没有更改的文件,这自然需要相当长的时间。为了改变这种情况,我希望它比较这两个文件(在 PC 上和 USB 记忆棒上)的修改时间。所以现在我想知道如何将输出从

stat -c %y /test_folder/test.txt

格式为“YmDHMS”?或者也许有人知道更好的方法来比较文件。

答案1

为了比较文件的修改(或访问或 inode 更改)时间,您应该使用自纪元以来的秒数,这样在比较中更容易处理。stat-c选项具有%Y格式说明符,用于获取自纪元以来的修改时间(以秒为单位)。

要根据修改时间比较两个文件,可以编写一个小函数:

chk_mod () { (( $(stat -c '%Y' "$1") > $(stat -c '%Y' "$2") )) && echo "$1 is newer" \
            || echo "$2 is newer" ;} 

将两个输入文件作为第一个和第二个位置参数输入,函数将输出哪一个较新;当它们具有完全相同的修改时间时,将不会显示任何输出。

例子:

$ chk_mod () { (( $(stat -c '%Y' "$1") > $(stat -c '%Y' "$2") )) && echo "$1 is newer" || echo "$2 is newer" ;}

$ chk_mod foobar spamegg 
spamegg is newer

答案2

为了进行比较,您最好stat -a %Y直接使用自纪元以来的秒数(即),或者更简单地使用 bash 内置文件测试之一[[ FILE1 -nt FILE2 ]],或者[[ FILE1 -ot FILE2 ]]改为:

   file1 -nt file2
          True if file1 is newer (according  to  modification  date)  than
          file2, or if file1 exists and file2 does not.
   file1 -ot file2
          True  if file1 is older than file2, or if file2 exists and file1
          does not.

但是,由于所问的问题是关于转换的,由于%y是修改时间,如果您有最新版本的 GNU,date您可以作弊并使用它。来自man date

-r, --reference=FILE
       display the last modification time of FILE

所以

$ date +%Y%m%d%H%M%S -r file
20170111075620

或者,你可以将自纪元以来的秒数从 传递statdate

$ date +%Y%m%d%H%M%S -d "@$(stat -c '%Y' file)"
20170111075620

相关内容