如何通过 bash 脚本将日期附加到目录中的所有文件而不触及子目录

如何通过 bash 脚本将日期附加到目录中的所有文件而不触及子目录

我目前正在上操作系统课程,作为课程的一部分,我们正在学习编写 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一起使用:execsh -c

find . -maxdepth 1 -type f -exec sh -c 'mv -- "$0" "$0"-$(stat -c %Y "$0" | date +%Y%m%d)' {} \;

然而,管道statdate我来说没有多大意义。如果你想追加当前的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"))' {} \;

相关内容