0

我有这个 bash 脚本,我试图将目录中的所有 *.txt 文件更改为其最后修改的日期。这是脚本:

#!/bin/bash
# Renames the .txt files to the date modified
# FROM: foo.txt  Created on: 2012-04-18 18:51:44
# TO:    20120418_185144.txt
for i in *.txt
do
mod_date=$(stat --format %y "$i"|awk '{print $1"_"$2}'|cut -f1 -d'.'|sed 's/[: -]//g') 
mv "$i" "$mod_date".txt
done

我得到的错误是:

renamer.sh: 6: renamer.sh: Syntax error: word unexpected (expecting "do")

任何帮助将不胜感激。感谢您的时间。

4

2 回答 2

2

我总是很惊讶地看到人们如何在grep通过seds 到s 到awks 到cuts 到heads 和tails 的管道中变得非常聪明......

在您的特定情况下,您真的很幸运,因为该date命令可以格式化文件的修改日期(使用-r选项)!

因此,

#!/bin/bash

# It's a good idea to use one of the two:
shopt -s failglob
# shopt -s nullglob

for i in *.txt; do
    mod_date=$(date -r "$i" +'%Y%m%d_%H%M%S')
    mv "$i" "$mod_date.txt"
done

应该做的伎俩。

关于nullglobor failglob:如果没有匹配的文件*.txt,则脚本将退出并出现错误(使用时failglob),或者,如果使用nullglob,则不会发生任何事情,因为在这种情况下*.txt会扩展为空。

于 2012-12-01T08:44:13.697 回答
0

您粘贴的代码不完整。将下面的代码与您的代码进行比较。

#!/bin/bash
# Renames the .txt files to the date modified
# FROM: foo.txt  Created on: 2012-04-18 18:51:44
# TO:    20120418_185144.txt
for i in *.txt
do
    mod_date=$(stat --format %y "$i"|awk '{print $1"_"$2}'|cut -f1 -d'.' | sed 's/[: -]//g')
    mv "$i" "${mod_date}.txt"
done
于 2012-12-01T05:02:44.613 回答