您好,我需要将文件重命名为其修改日期的 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 日期。
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'
的输出保存在文件中,以供以后参考(这会在同一行打印文件路径和修改时间)。另外,也许是快照(如果可能的话)。
与接受的答案相同,但我发现它更具可读性
#!/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";
' \;
stat
命令可能需要类似 %Y
而不是 %m
yyyymmdd-hhmmss-
来重命名每个文件