我刚刚开始学习 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
或者,你可以将自纪元以来的秒数从 传递stat
给date
:
$ date +%Y%m%d%H%M%S -d "@$(stat -c '%Y' file)"
20170111075620