2017-04-19 125 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」)' –

相關問題