如何根据创建时间重命名多个文件?

qwe*_*rty 3 linux timestamps rename

#!/bin/sh
for f in *.png
do
    echo mv -n "$f" "$(date +%Y%m%d-%H-%M-%S)_$f"
done
Run Code Online (Sandbox Code Playgroud)

我想用 ( ls -lt --full-time) 中所述的时间戳重命名几个文件,但是当我运行上面的代码时,名称使用当前日期/时间或修改时间。我想要 yymmdd 格式的年、月、日。

Sté*_*las 7

只需使用-rGNU 的选项date,它会在符号链接解析后报告与文件的最后修改时间相对应的日期(就像这样ls -Ll做)

\n
#!/bin/sh -\nfor f in *.png\ndo\n  t=$(date -r "$f" +%Y%m%d-%H-%M-%S) &&\n    echo mv -n -- "$f" "${t}_$f"\ndone\n
Run Code Online (Sandbox Code Playgroud)\n

或者使用zsh它的stat 内置函数以任何格式格式化时间:

\n
#! /bin/zsh -\nzmodload zsh/stat || exit\n\nfor f (*.png(N))\n  stat -A t -F %Y%m%d-%H-%M-%S +mtime -- $f &&\n    print -r mv -n -- $f ${t}_$f\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,包括 GNU 和 BSD 在内的一些系统已经添加了(很久以后\xc2\xb9)自己的stat命令,尽管具有完全不同的 API(来自 zsh\'s 以及彼此之间的 API)。

\n

exiftool还可以根据文件的任何属性重命名任何文件:

\n
exiftool -d %Y%m%d-%H-%M-%S \'-FileName<${FileModifyDate}_${FileName}\' -- *.png\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,所有这些和您的ls -lt --full-time(可能应该有一个额外的,-L以防其中一些 png 文件是符号链接)查看文件的最后修改时间。这可以被视为文件内容的创建时间,这通常是您所关心的。Linux 上的文件也有所谓的出生时间,也称为创建时间,它反映了文件产生的时间(但与内容的创建时间关系不大)。

\n

ls对于具有最新内核和 GNU libc的最新版本的 GNU (因此不能在 CentOS 上),您可以使用 检索它ls --time=birth -Ll --full-time,并且使用最新版本的 GNUstat使用stat -Lc %w,但date、 zshstat都不能exiftool检索它,因为执行此操作的 API 非常复杂最近的且特定于 Linux 的。而且该时间戳通常没有用。请参阅文件创建时间是否仍然没有 Linux 内核接口来获取文件创建日期?了解详情。

\n
\n

\xc2\xb9 但请注意,早期的 Unix 版本确实有一个stat命令。由于某种原因,它似乎在 70 年代中期消失了,因为研究 Unix v6 不再有它了。

\n