Bash:将文件名重命名为修改日期的unix时间戳

问题描述 投票:0回答:2

您好,我需要将文件重命名为其修改日期的 unix 时间戳,并将其附加为前缀。

换句话说,我需要一个脚本来批量重命名 文件如

ABC.jpg

XYZ.png

1649493072000 ABC.jpg

1649493072182 XYZ.png

我还喜欢在以这种方式修改的每个文件前面附加一个 u-。

所以我喜欢转弯

ABC.jpg

XYZ.png

进入

u-1649493072000 ABC.jpg

u-1649493072182 XYZ.png

PS:

对于所有 mod,请注意,我的问题与已经提出的其他问题不同,因为我询问的是文件的 UNIX 修改时间戳,而不是像 2022-04-09 这样的 ISO 日期。

linux bash file timestamp
2个回答
3
投票
find . -type f -exec \
sh -c '
for i do
    d=$(dirname "$i")
    [ "$d" = / ] && d=
    n=${i##*/}
    echo mv "$i" "$d/u-$(stat -c %Y "$i") $n"
done' _ {} +
  • 这会在当前目录中递归操作(

    .
    )。它仅针对常规文件(而不是目录等)。如果需要,修改
    -type f
    和其他标志。

  • 它只是打印 mv 命令,以便您可以查看它们。删除

    echo
    即可真正运行。

  • 我们使用

    find
    列出目标文件,并使用其
    -exec
    标志将此列表传递给 shell 循环,我们可以在其中解析和修改文件名,包括
    stat
    来获取修改时间。

  • 我不知道您的用例,但更好的解决方案可能是将

    find . -type f -printf '%p u-%T@\n'
    的输出保存在文件中,以供以后参考(这会在同一行打印文件路径和修改时间)。另外,也许是快照(如果可能的话)。


0
投票

与接受的答案相同,但我发现它更具可读性

#!/bin/bash

find $1 -type f -exec \
bash -c '
    FILEPATH="{}"
    BASEDIR=$(dirname "$FILEPATH")
    [ "$BASEDIR" = / ] && BASEDIR=
    FILENAME=$(basename "$FILEPATH")
    TIMESTAMP=`stat -f "%m" "$FILEPATH"`;
    DATENAME=`date -r $TIMESTAMP '\''+%Y%m%d-%H%M%S'\''`-$FILENAME
    echo mv -v "$FILEPATH" "$BASEDIR/$DATENAME";
' \;
  • 将其保存为 shell 脚本并使用 basedir 作为参数 ($1) 来调用它
  • 这适用于 osx - 在 ubuntu 上,
    stat
    命令可能需要类似
    %Y
    而不是
    %m
  • 通过在文件名前添加
    yyyymmdd-hhmmss-
    来重命名每个文件
© www.soinside.com 2019 - 2024. All rights reserved.