将上次编辑的人类可读时间戳附加到文件名

将上次编辑的人类可读时间戳附加到文件名

我想使用 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;我不知道这个选项。

相关内容