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
添加日期将根据脚本运行的日期而改变。
答案 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 bash
和POSIX 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
的身份调用它)