我到处搜索,想出下面这个脚本。我无法弄清楚这里的问题是什么。 我正在尝试遍历名为Extracted_Source的目录中的所有目录,以重命名任何带有附加时间戳的CSV文件。 任何帮助表示赞赏。
我一直在
No such file or directory./Extracted_Source/*
以下是来源:
for files in ./Extracted_Source/*
do if ["$files" contains ".csv"]
then mv "$files" "${files%}_$(date "+%Y.%m.%d-%H.%M.%S").csv";
fi done; echo end
答案 0 :(得分:1)
我会使用find
find ./Extracted_Source -type f -name "*.csv" | while -r read files; do mv "$files" "${files%.*}_$(date "+%Y.%m.%d-%H.%M.%S").csv"; done
这还有一个额外的好处,就是处理文件名中包含空格的文件。
这是多线形式的相同内容:
find ./Extracted_Source -type f -name "*.csv" | \
while read -r files; do
mv "$files" "${files%.*}_$(date "+%Y.%m.%d-%H.%M.%S").csv"
done
您还可以使用流程替换来提供while
循环:
while read -r files; do
mv "$files" "${files%.*}_$(date "+%Y.%m.%d-%H.%M.%S").csv"
done < <(find ./Extracted_Source -type f -name "*.csv")
在您当前的脚本中,${files%}
没有做任何事情。该文件的.csv
部分未被删除。正确的方法是${files%.*}
。
试着这样看看自己:for files in *; do echo "${files%.*}"; done
有关详细信息,请参阅Bash Hackers Wiki。
答案 1 :(得分:0)
首先,错误消息表示您在./Extracted_Source/
中没有任何文件或文件夹。但是,以下内容可行:
#!/bin/bash
for file in ./Extracted_Source/*/*.csv; do
mv "$file" "${file/.csv}_$(date "+%Y.%m.%d-%H.%M.%S").csv";
done
echo end
这并不考虑已经移动过的csv文件。