重命名Lunix中的文件以循环

时间:2019-01-29 09:36:24

标签: bash shell unix scripting

I have files like below in a directory in unix:
2007 CSE Classes.csv
2007 EEE Classes.csv
2007 ECE Classes.csv
2008 CSE Classes.csv
.
.
.
2018 ECE Classes.csv

需要重命名以下内容:

2007 CSE Classes_20190129.csv
2007 EEE Classes_20190129.csv
2007 ECE Classes_20190129.csv
2008 CSE Classes_20190129.csv
.
.
.
2018 ECE Classes_20190129.csv

文件名中也有空格。

添加日期将根据脚本运行的日期而改变。

2 个答案:

答案 0 :(得分:0)

我相信您可以做到这一点

for i in `find /path/to/yourFiles/directory -name "*.csv"` ; do mv $i ${i}_$(date +"%m-%d-%y").csv ; done

答案 1 :(得分:0)

首先,您需要获取文件列表。您可以为此使用{例如*Classes.csv

然后,您需要遍历此列表。如果您是这样开始的,它应该打印出所有文件:

for file in *Classes.csv; do
    printf %s\\n "$file"
done

如果看起来正确,则现在您需要知道要重命名为的文件名。在这里,我将在参数扩展中使用%运算符将.csv裁剪掉。 man bashPOSIX shell specifications中记录的内容是从字符串中删除了最小的匹配后缀。

for file in *Classes.csv; do
    file_noext=${file%.csv}
    printf '%s -> %s\n' "$file" "$file_noext"
done

已经到了一半,现在我们需要添加日期并重新添加.csv后缀。该日期类似于%F格式(2019-01-29),但不包含连字符。如果您可以自由选择,我建议改用%F格式,因为对于偶然的观察者来说,这显然是一个日期。对于您的格式,您将需要%Y%m%d(请参阅man 1 date)。我在这里使用$(...)命令替换语法来捕获date命令的输出。

today=$(date +%Y%m%d)
for file in *Classes.csv; do
    file_noext=${file%.csv}
    printf '%s -> %s\n' "$file" "${file_noext}_${today}.csv"
done

如果所有输出看起来正确,您将需要进行最终更改并使用mv而不是仅打印文件名:

today=$(date +%Y%m%d)
for file in *Classes.csv; do
    file_noext=${file%.csv}
    mv -- "$file" "${file_noext}_${today}.csv"
done

这应该是所有必要的。

您的问题明确要求进行for循环,但是通常我只会使用util-linux rename实用工具:

rename 'Classes' "Classes_$(date +%Y%m%d)" ./*Classes.csv

请注意,这种单行代码在Ubuntu Linux上不起作用,因为它们提供了不兼容的rename实用程序。 (在此类系统上,您需要以rename.ul的身份调用它)