![将上次编辑的人类可读时间戳附加到文件名](https://linux22.com/image/34459/%E5%B0%86%E4%B8%8A%E6%AC%A1%E7%BC%96%E8%BE%91%E7%9A%84%E4%BA%BA%E7%B1%BB%E5%8F%AF%E8%AF%BB%E6%97%B6%E9%97%B4%E6%88%B3%E9%99%84%E5%8A%A0%E5%88%B0%E6%96%87%E4%BB%B6%E5%90%8D.png)
我想使用 bash 将上次更改文件的时间添加到其文件名中。
例如这个输出ls -la
:
-rw-rw-r-- 1 beginner beginner 5382 Dec 1 17:18 B_F1-1.xml
应该成为
-rw-rw-r-- 1 beginner beginner 5382 Dec 1 17:18 B_F1-1_20141201T1718.xml
我怎样才能对 . 中的所有文件执行此操作?
答案1
你可以尝试这样的事情:
EXT=${FILE#*.}
NAME=${FILE%%.*}
mv "$FILE" "$NAME$(date --reference "$FILE" '+%Y%m%dT%H%M').$EXT"
在脚本中,如果您date
支持--reference
,它将获取参考文件的最后修改日期。
答案2
我认为这可行:
for i in *; do
fileTime=$(stat -c %Y "$i"); #Get last modification (since EPOCH)
formatDate=$(date +%Y%m%dT%H%m -d @"$fileTime"); #Get time in format YYYYMMDDTHHmm
mv "${i%%.*}"_"$formatDate"."${i#*.}"; #Appends "formatDate" before extension
done
问候。
答案3
这一切都可以通过 oneliner 来完成。
for i in *.* ; do mv "$i" "${i%.*}_$(date --reference "$i" +%Y%m%dT%H%M).${i##*.}"; done
对于字面意义时间戳,即自纪元以来的秒数,您可以使用:
for i in *.* ; do mv "$i" "${i%.*}_$(date --reference "$i" +%s).${i##*.}"; done
这有一个安全检查,仅对名称包含点的文件进行操作;它可以正确处理名称中带有空格的文件;它假设(通常是这种情况)最后一个点分隔字段是扩展名,而不是第一个点分隔字段是文件名,其余字段是扩展名。
这一点要归功于穆鲁--reference
;我不知道这个选项。