#!/bin/sh
for f in *.png
do
echo mv -n "$f" "$(date +%Y%m%d-%H-%M-%S)_$f"
done
我想用 ( ) 中所述的时间戳重命名几个文件ls -lt --full-time
,但是当我运行上面的代码时,名称使用当前日期/时间或修改时间。我想要 yymmdd 格式的年、月、日。
答案1
只需使用-r
GNU 的选项date
,它会在符号链接解析后报告与文件的最后修改时间相对应的日期(就像这样ls -Ll
做)
#!/bin/sh -
for f in *.png
do
t=$(date -r "$f" +%Y%m%d-%H-%M-%S) &&
echo mv -n -- "$f" "${t}_$f"
done
或者使用zsh
它的stat
内置函数以任何格式格式化时间:
#! /bin/zsh -
zmodload zsh/stat || exit
for f (*.png(N))
stat -A t -F %Y%m%d-%H-%M-%S +mtime -- $f &&
print -r mv -n -- $f ${t}_$f
请注意,包括 GNU 和 BSD 在内的一些系统已经添加了(很久以后1)它们自己的stat
命令,尽管具有完全不同的 API(来自 zsh 以及彼此之间的 API)。
exiftool
还可以根据文件的任何属性重命名任何文件:
exiftool -d %Y%m%d-%H-%M-%S '-FileName<${FileModifyDate}_${FileName}' -- *.png
请注意,所有这些和你的ls -lt --full-time
(可能应该有一个额外的-L
,以防其中一些 png 文件是符号链接)查看文件的最后修改时间。这可以被视为文件内容的创建时间,这通常是您所关心的。 Linux 上的文件也有所谓的出生时间又名创建时间它反映了文件产生的时间(但与内容创建的时间关系不大)。
ls
对于具有最新内核和 GNU libc的最新版本的 GNU (因此不在 CentOS 上),您可以使用 来检索它ls --time=birth -Ll --full-time
,并且对于最新版本的 GNUstat
来说stat -Lc %w
,可以使用 来检索它,但date
、 zshstat
或exiftool
不能检索它,因为执行此操作的 API 非常复杂最近的且特定于 Linux 的。而且该时间戳通常没有用处。看文件何时创建或者Linux 内核还没有接口来获取文件创建日期吗?了解详情。
1 但请注意,早期的 Unix 版本确实有一个stat
命令。由于某种原因,它似乎在 70 年代中期消失了,因为研究 Unix v6 不再有它了。
答案2
您应该使用stat
命令来获取文件日期。我不知道你是想获取文件的创建日期(出生日期)还是修改日期。我将提供一个使用这两个日期的示例。
使用出生日期
#!/bin/sh
for f in *.png
do
cdate=$(stat -c '%w' "$f" | cut -d ' ' -f1)
echo mv -n "$f" "${cdate}_$f"
done
使用修改日期
#!/bin/sh
for f in *.png
do
mdate=$(stat -c '%y' "$f" | cut -d ' ' -f1)
echo mv -n "$f" "${mdate}_$f"
done
您stat -c '%w' somefile
可以获取创建/出生日期,也可以stat -c '%y' somefile
获取修改日期。
上面的代码将以YYYYMMDD
格式返回日期,如果您只想获取YYMMDD
格式,您可以应用参数扩展(我不确定 POSIX 或 是否支持此功能sh
)。这是另一个例子(使用 bash):
使用出生日期
#!/bin/bash
for f in *.png
do
cdate=$(stat --printf='%.10w\n' "$f")
echo mv -n "$f" "${cdate#??}_$f"
done
使用修改日期
#!/bin/bash
for f in *.png
do
mdate=$(stat --printf='%.10y\n' "$f")
echo mv -n "$f" "${mdate#??}_$f"
done
使用stat --printf='%.10w\n'
orstat --printf='%.10y\n'
我得到了表示日期格式的字符串的前十个字符YYYYMMDD
。使用${cdate#??}
or${mdate#??}
删除日期的前两位数字,以便我得到该日期的YYMMDD
格式。