2015-12-28 26 views
-2

我有一個文件目錄,其中一些以下劃線結尾。Bash重命名字符串中的最後一個下劃線

我想測試每個文件,看它是否以下劃線結尾,然後去掉下劃線。

我目前運行下面的代碼:

for file in *;do 
    echo $file; 
    if [[ "${file:$length:1}" == "_" ]];then 
     mv $file $(echo $file | sed "s/.$//g"); 
    fi 
done 

但它似乎並沒有被重命名使用下劃線的文件。例如,如果我有一個名爲all_indoors_的文件,我期望它能給我all_indoors

+0

你只是想刪除下劃線,沒有別的?另外,'$ length'在哪裏定義? – fedorqui

+0

你的意思是帶* off?刪除下劃線,或下劃線和其餘文本? –

+1

@fedorqui不知道,認爲我犯了一個錯誤:-) – andlrc

回答

0

可以使用,這將是遞歸的:

while read f; do 
    mv "$f" "${f:0:-1}"; # Remove last character from $f 
done < <(find . -type f -name '*_') 
+0

如果文件名中有新行,這將會中斷。我建議循環遍歷glob而不是使用find在這裏。 – hek2mgl

0

雖然不是純bash的方法,你可以使用rename.ul(由Larry Wall寫,後面的人perl)。重命名不是默認Linux環境的一部分,但是是util-linux的一部分。

您使用與重命名:

rename perlexpr files 

(一些標誌ommitted)。

所以,你可以使用:

rename 's/_$//' * 

,如果你想刪除所有的字符,包括和下劃線後。

正如@ hek2mgl指出的那樣,有多個rename命令(請參閱here),所以首先測試是否選擇了正確的命令。

+0

來自util-linux的'rename'命令*不能用於perl正則表達式! (我也需要認識到...;)) – hek2mgl

+0

@ hek2mgl:那麼爲什麼文檔中指定了這樣的內容呢? –

+0

如果你的'man rename'這樣說,它不是'util-linux'。 '重命名-V'給你什麼? '從util-linux 2.26.2'重命名?我想你是指http://search.cpan.org/dist/rename/。漂亮的工具!但不幸的是,它不是'util-linux'的一部分。 – hek2mgl

1

只需使用一個regex to check the string

for file in * 
do 
    [[ $file =~ "_$" ]] && echo mv "$file" "${file%%_}" 
done 

一旦確認它按預期工作,除去echo使得mv命令執行!


它甚至可能是清潔劑使用*_,使for將剛剛超過與_結尾的名稱的文件迴路,如hek2mgl暗示的意見。

for file in *_ 
do 
    echo mv "$file" "${file%%_}" 
done 
+2

我喜歡這個答案,但是爲什麼不用''for file in * _'?這將爲您節省正則表達式檢查。 – hek2mgl

+0

@ hek2mgl你是這裏最聰明的方法:)我沒有想過,用它更新我的答案! (或者隨意添加自己的答案,當然)。 – fedorqui

+1

不,不..去吧! :) – hek2mgl

相關問題