2016-10-11 97 views
0

我有一個不同的文件夾,如abc.mp3 acc.mp3 bbb.mp3中的文件,我想重命名它們01-abc.mp3,02-acc.mp3,03-bbb .MP3 ......我想這使用查找shell重命名文件夾中的文件

#!/bin/bash 

IFS=' 
' 
COUNT=1 
for file in ./uff/*; 
do mv "$file" "${COUNT}-$file" let COUNT++ done 

,但我不斷收到這樣的錯誤的語法錯誤附近「做,有時沒有找到,使用‘查找’,從終端有人可以提供單線解決這個。我正在尋找一個解決方案,使用查找只是由於一定的限制...在此先感謝

+1

至少,你需要一個分號(或換行符 - 這會更好)在'let' a之前在完成之前。如果你在數字前綴中需要兩位數字,你需要更加努力:'printf「%.2d-%s」「$ COUNT」「$ file」'會更好地生成格式。 –

+0

千萬不要混淆'$ IFS'。我從來沒有遇到過使用它的好理由,並且它把你的整個腳本搞砸了。 –

+0

@ParthianShot:「從不」是一種過度陳述,但很少需要這樣做,而且這不是其中之一(所以我同意你的建議的要點)。 –

回答

2

我可能會使用:

#!/bin/bash 

cd ./uff || exit 1 

COUNT=1 
for file in *.mp3; 
do 
    mv "$file" $(printf "%.2d-%s" ${COUNT} "$file") 
    ((COUNT++)) 
done 

這就避免了一些問題,也包括今年前9個文件(一個2位數接下來的90會得到2位數字,之後你會得到3位數字等等)。

+0

mv:target'abc.mp3'不是目錄得到以下錯誤..它不適用於第一個文件..但工作休息 – coder007

+0

不知道你做了什麼。我創建了一個目錄'uff'並在其中放入3個文件。然後我跑了顯示的腳本。與IFS沒有差距,等等。'cd'也很重要。 –

+0

that worked ..實際上第一個文件名在名稱的開頭有一個空格...任何黑客忽略空間? – coder007

0

這是一個解決方案。

i=1 
for f in $(find ./uff -mindepth 1 -maxdepth 1 -type f | sort) 
do 
    n=$i 
    [ $i -lt 10 ] && n="0$i" 
    echo "$f" "$n-$(basename "$f")" 
    ((i++)) 
done 

這裏,它是作爲一個班輪(但在現實生活中,如果你曾經嘗試過任何類似於什麼是下面的編碼或OPS採訪你不僅不能得到這份工作,你會可能會給面試官創傷後應激障礙(PTSD),他們會在冷汗中醒來,思考你的解決方案有多糟糕)。

i=1; for f in $(find ./uff -mindepth 1 -maxdepth 1 -type f | sort); do n=$i; [ $i -lt 10 ] && n="0$i"; echo "$f" "$n-$(basename "$f")" ; ((i++)); done 

或者,你可以只cd ./uff,如果你想在同一目錄下將其重命名,然後用find .(連同其他發現參數)來清除一切。我假設你只想移動文件,而不是目錄。我假設你不想遞歸重命名文件/目錄。

0

你可以試試這個;

#!/bin/bash 
COUNT=1 
for file in ./uff/*; 
do 
path=$(dirname $file) 
filename=$(basename $file) 

    if [ $COUNT -lt 10 ]; then 
     mv "$file" "$path"/0"${COUNT}-$filename"; 
    else 
     mv "$file" "$path"/"${COUNT}-$filename"; 
    fi 

COUNT=$(($COUNT+1)); 

done 

如:

[email protected]:/tmp/test$ ls uff/ 
abc.mp3 acc.mp3 bbb.mp3 

[email protected]:/tmp/test$ ./test.sh 

[email protected]:/tmp/test$ ls uff/ 
01-abc.mp3 02-acc.mp3 03-bbb.mp3 
0

好吧,這裏的版本沒有循環:

paste -d'\n' <(printf "%s\n" *) <(printf "%s\n" * | nl -w1 -s-) | xargs -d'\n' -n2 mv -v 

您也可以使用find如果你想:

paste -d'\n' <(find -mindepth 1 -maxdepth 1 -printf "%f\n") <(find -mindepth 1 -maxdepth 1 -printf "%f\n" | nl -w1 -s-) | xargs -d'\n' -n2 mv -v 

更換mvecho mv的 「預演」:

paste -d'\n' <(printf "%s\n" *) <(printf "%s\n" * | nl -w1 -s-) | xargs -d'\n' -n2 echo mv -v