抱歉問這個問題。我在互聯網上搜索了很多,但找不到有效的答案(儘管有很多建議)。
所以,我想重命名很多檔案。寫入所有檔案名稱不是一個選項。這些文件的命名如下:
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_patternXoptions
(X
可以是任何字元)。 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