将文件的最后修改日期附加到其名称

Append a file's last modification date to its name

我正在努力寻找一种方法来获取文件夹和子文件夹中每个文件的最后修改日期,并将它们相应地附加到它们的名称中。到目前为止,我只能为每个文件附加一个自定义文本,在这种情况下,它是来自此命令的 _Suffixfind * -exec mv {} {}_Suffix \;

也许这不是最好的方法,因为我的文本被插入到文件的最后,所以它改变了文件的扩展名,但至少它有效:)

但我想知道如何插入最后修改日期而不是 _Suffix 并递归地为每个文件执行此操作。

find . -type f -exec bash -c 'for arg; do arg=${arg#./} mod=$(stat -c %x "$arg") base=${arg%.*} ext=${arg#$base}; echo mv -i "$arg" "${base}_${mod%% *}$ext"; done' _ {} +

(多行版本以提高可读性):

find . -type f -exec bash -c 'for arg; do
  arg=${arg#./} mod=$(stat -c %x "$arg") base=${arg%.*} ext=${arg#$base}
  echo mv -i "$arg" "${base}_${mod%% *}$ext"
done' _ {} +

我把 echo 留在那里让你在 运行 实际 运行 之前 看看 会发生什么。确定要移动文件后将其删除。

它在 扩展之前添加了你想要的内容,但它会完全 FAIL 如果:

  • 文件名不包含点
  • 该文件位于包含点的文件夹路径中

它也无法在具有双扩展名的文件上正常工作,例如.tar.gz

说明: 我使用 find . -type f -exec bash -c '...' _ {} + 将所有文件传递给 bash 脚本 bash 脚本对所有文件执行相同的操作:获取修改 date,发现 basename.extension,然后将文件重命名为 basename_date.extension