2016-10-07 25 views
0

我試過尋找類似的問題,但找不到任何東西,所以如果之前曾問過這個或類似的道歉。OSX Bash:動態地重命名從列表中找到的文件

我正在寫一個腳本來讀取帶有參考號碼的文件名的文本列表,然後查看這些文件的子文件夾,然後修改名稱以包含參考號。

文本文件看起來像這樣(製表符分隔,並用頭):

"File Name (without Extension)" "Media Number" 
"AK7A7964" "01017134" 
"IMG_0026" "01017192" 
"106491 Anenome" "01017206" 
"CW1_9449" "01017243" 

我使用這種清潔的\ t文件和「:

cat $file | sed "1 d" | tr "\\t" "," | sed 's/\"//g' > $cleanfile 

然後閱讀cleanfile轉換爲while循環:

INPUT=$cleanfile 
OLDIFS=$IFS 
IFS=, 
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; } 
while read fname media; do 

並構造新的名稱以修改爲開始的fi lename

newFileName="MA_${media}_" 

我然後使用做了找到具有該名稱的每個文件:

for found in $(find . -type f -name "$fname.*"); do 

但是當我嘗試修改名字,它只有在有多個文件改變最後的結果與找到的同名。

我可能錯過了使用sed這樣做的一個竅門,但是我找不到一個指南,它不會很快在深層次發展!

[編輯添加]

我在做什麼,最後do是在此之後: 獲取路徑和基本名稱,創建新的文件名,然後使用mv來取代它。我其實只是在做一個echo所以它是無損

foundPath="${found%/*}" 
foundFile="${found##*/}" 

newFile=$newFileName$foundFile 
newFilePath="${foundPath}/${newFile}" 
mv $found $newFilePath 

如果有任何文件名中出現了多次(如會有),那也只是mv「荷蘭國際集團是最後一個。

+0

,如果你提供你在你的循環do'後'做什麼,這將是有幫助的。 –

+0

如果名稱中有空格,循環將不起作用,如'106491 Anenome'。 – Barmar

+0

''read''循環如何使用','作爲'fname'和'media'之間的分隔符? – Barmar

回答

0

我找到了解決辦法是這樣的:

find . -type f -name "${fname}.*" -exec sh -c 'for i; do name=${i##*/} path=${i%/*}; mv "$i" "$path/MA_${media}_$name"; done' _ {} +