如何在 bash shell 中重命名大量檔案?

如何在 bash shell 中重命名大量檔案?

抱歉問這個問題。我在互聯網上搜索了很多,但找不到有效的答案(儘管有很多建議)。

所以,我想重命名很多檔案。寫入所有檔案名稱不是一個選項。這些文件的命名如下:

HAUPT_SIA_039.MR.NEUROPSYCHOLOGIE_LOGIN.0003.0001.2014.03.28.14.49.59.511530.47117493.IMA

所有檔案的開頭始終相同,並且 .IMA 長編號也不同。對於所有文件,我必須將 039 更改為 036_2。其餘部分應保持不變。

我嘗試了以下所有命令(以及其他幾個命令),但它沒有執行任何操作:

cd my_directory

rename 's/\w039_2\w/\w036_2\w/g' * 

rename ?039_2? ?036_2? ?0_39_2?.IMA

rename 's/?039_2?/?036_2?/' ?039_2?.IMA

rename 's/\w039_2\w/\w036_2\w/' ?039_2?.IMA

Perl 安裝在 Linux 系統上(但我不知道如何呼叫它......因為如果我打開 Perl 終端,它不會執行任何操作)。

你能幫助我嗎?

答案1

for file in * ; do mv $file $(echo $file | sed 's/_039/_036_2') ; done

解釋:

for file in * ; do _______ ; done

bash 將執行 shell 擴充功能以*列出工作目錄中的每個檔案。對於每個文件,此命令結構會將變數設定file為等於文件名,並在; do和之間執行命令; done

mv $file _______

mv是 unix/linux 中重新命名檔案的傳統方法。它將重命名file_______

echo $file | sed 's/_039/_036_2'

echo $file | sed將簡單地將“ file”發送到 的標準輸入sed,其中sed將用“_039”替換“_036_2”

總共:對於目前目錄中的每個文件,重新命名該文件,用“_039”替換“_036_2”

答案2

你的正規表示式搞砸了,這是一個應該可以工作的正規表示式。

rename 's/HAUPT_SIA_039[.]\(.*\)/HAUPT_SIA_039_2.\1/g' HAUPT_SIA*.IMA

您使用的是正確的工具,除非您有子目錄,否則不需要尋找。


請注意 sed 和重新命名中的正規表示式。

格式為sXsearch_patternXreplace_patternXoptionsX可以是任何字元)。 searchPattern 是您要替換的內容,是已經存在的內容,而不是您要替換的內容。

-w是單字,並且只能出現在 search_pattern 中。

答案3

尋找 。 -名稱“*039*”|重新命名's/039/036_2/g'

答案4

循環所有帶有“HAUPT_...”前綴的文件,然後使用 shell 子字串重命名${f:15}返回文件名第 15 個字元的字串,附加到前綴HAUPT_...

for f in "HAUPT_SIA_039*" ; do  mv $f "HAUPT_SIA_036_2${f:15}"; done

編輯 - 包含所有檔案的目錄似乎也包含具有相同 HAUPT... 前綴的子目錄。在這種情況下,請使用該find命令首先僅過濾檔案而不是目錄。

find . -type f -name "HAUPT_SIA_039*" | while read f; do mv $f "HAUPT_SIA_036_2${f:15}"; done

相關內容