2017-04-09 189 views
2

以下腳本刪除破折號字符發現在當前目錄(遞歸)中的所有文件,並替換破折號 - 字符轉換爲下劃線字符文件名腳本重命名文件 - 從Android的資源文件

find . -type f -name '*.png' | while read FILE ; do 
    newfile="$(echo ${FILE} |sed -e 's/-/_/g')"; 
    mv "${FILE}" "${newfile}" ; 
done 

給出一個文件包含破折號的路徑(例如,drawable-hdpi/file-name.png),腳本會嘗試將其重命名爲drawable_hdpi/file_name.png - 替換目錄名稱中的破折號以及文件名中的破折號。

我想避免修改目錄路徑,只重寫文件名。

有關如何修改sed用法以跳過目錄路徑的任何建議?

+0

使用小寫變量名稱以避免與環境變量的潛在衝突是一個很好的做法......請參閱https://unix.stackexchange.com/questions/321697/why-is-looping-over-finds-輸出不良練習 – Sundeep

+0

取決於你的'find'版本和基於'rename'命令的可用性,你可以'find。 -type'fname'* .png'-exec rename -n's | [^ /] + $ | $&=〜s/-/_/gr | e'{} +'並且移除幹運行' - n'選項,一旦你看到該命令按預期工作 – Sundeep

+0

@Sundeep在osx上運行,它沒有重命名,所以我依賴於mv – aviran

回答

2

shell有一些漂亮的字符串操作符來切掉部分變量。你的shell手冊頁有所有的細節。下面是我會怎麼使用它們:

find . -type f -name '*.png' | 
while read FILE; do 
    dir=${FILE%/*} 
    newfile=$(echo "${FILE##*/}" |sed -e 's/-/_/g') 
    mv "${FILE}" "${dir}/${newfile}" 
done 

說明:

dir=${FILE%/*}砍下最短的部分從匹配/*水珠,消除斜線和文件名,並賦予該目錄的權利。

${FILE##*/}刪除左邊匹配的最長部分*/,即只留下文件名。

+0

很好用,謝謝! – aviran