2017-04-19 126 views
0

我已经搜索了无处不在,想出下面的脚本。我无法弄清楚问题在这里。 我试图循环遍历名为Extracted_Source的目录中的所有目录,以重命名任何带有附加时间戳的CSV文件。 任何帮助表示赞赏。在某个目录中递归地重命名某些文件 - Shell/Bash脚本

我不断收到一个

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

这意味着您的当前工​​作目录中不存在Extracted_Source文件夹,或者Extracted_Source /不包含任何文件。 'ls。/ Extracted_Source/*'显示什么?我想这将是同样的事情。 –

+0

您的*参数扩展w /子字符删除*'$ {files%}'删除** nothing **。也许你打算'$ {files%.csv} _...'? –

回答

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文件。

+1

这不会重命名“Extracted_Source”内部目录内的文件,这是问题的意图。 – odradek

+0

谢谢@odradek - 我已经更新了我的答案,并删除了不必要的if语句。 –

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

+0

你被覆盖了'-name“* .csv”',但是最好是明确地显示在删除*子字符串时被删除的内容。 '$ {files%.csv} _...'而不是'$ {files%。*} _'。这样做没有错,这只是一个潜在的澄清。另外,因为它被标记为'bash',所以你可以使用*进程替换*来提供'while'循环,例如。 '读取-r文件; do ... done <<(find ./Extracted_Source -type f -name“* .csv”)' –

相关问题