![如何通过 bash 脚本将日期附加到目录中的所有文件而不触及子目录](https://linux22.com/image/34503/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20bash%20%E8%84%9A%E6%9C%AC%E5%B0%86%E6%97%A5%E6%9C%9F%E9%99%84%E5%8A%A0%E5%88%B0%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E8%80%8C%E4%B8%8D%E8%A7%A6%E5%8F%8A%E5%AD%90%E7%9B%AE%E5%BD%95.png)
我目前正在上操作系统课程,作为课程的一部分,我们正在学习编写 bash 脚本。我需要将日期附加到目录中的所有文件,而不通过脚本接触子目录。我一直在编写一个单行脚本,它将日期附加到所有文件中,但它也会命中当前目录中的文件夹。
for f in *; do mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"; done
这会将日期附加到文件名的末尾,但正如我所说,它会命中其下的目录。我目前在 RedHatLinux 上使用 bash 4.1.2 版本。
由于我对 Unix 缺乏经验(我主要是 Windows 用户),所以我很困惑,因为所有人都出去了,所以任何帮助将不胜感激。
答案1
正如 slm 已经表明的那样,您可以测试是否$f
为常规文件。在学习时,我会将脚本更改为不单行,但它们往往更难阅读和维护:
for f in *
do
if [ -f "$f" ]
then
mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"
fi
done
(您可以稍后通过插入;
和删除换行符来折叠它)
测试-f
参数是否为常规文件(不是设备或目录),还有其他测试(-d
例如,对于目录,因此您也可以if [ ! -d "$f" ]
在这种情况下进行测试)。
答案2
这应该可以满足您的要求;
for file in $(find . -type f); do mv -- "$file" "$file-$(stat -c %Y "$file" | date +%Y%m%d)"; done
解释一下新部分,您使用 find 命令仅查找文件(类型 -f);
find . -type f
。
答案3
您根本不需要循环,只需与选项 +find
一起使用:exec
sh -c
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(stat -c %Y "$0" | date +%Y%m%d)' {} \;
然而,管道stat
对date
我来说没有多大意义。如果你想追加当前的stat
那么根本不需要所有文件名的日期:
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date +%Y%m%d)' {} \;
另一方面,如果您想附加时间最后修改每个文件的然后使用-r
以下选项date
:
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date -r "$0" +%Y%m%d)' {} \;
如果您想,只是为了练习,使用输出作为stat
的输入date
,然后使用命令--date
选项date
:
find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(date +%Y%m%d --date=@$(stat -c %Y "$0"))' {} \;