2017-08-01 144 views
-3

我在一個目錄中有多個文件,格式如下,其中開始日期和.log(最後)將是相同的,但在文件名之間會有所不同。在Bash中批量重命名文件

27_07_2017file1vc001vpxd-1605.log 
27_07_2017case2vc001vpxd-9169.log 
27_07_2017server3vc001vpxd-4640.log 
27_07_2017file24vc001vpxd-9170.log 
27_07_2017files5vc001vpxd-4641.log 

file1vc001vpxd-1605_27_07_2017_1.log 
case2vc001vpxd-9169_27_07_2017_1.log 
server3vc001vpxd-4640_27_07_2017_1.log 
file24vc001vpxd-9170_27_07_2017_1.log 
files5vc001vp-4641_27_07_2017_1.log 

我有不同的幾個文件。請將上述文件名視爲file1,file2,file3,file4,case1,case2,number1,number2 ...等。單詞「文件」並不是固定在所有文件名格式的手段 - 它應該重命名爲filename_date_1.log。換句話說,它應該減少中間名是日之後,並保持第一和日期中間等

請不要使用renamesed命令提示,因爲rename在我的Linux服務器和組織不起作用不允許我使用sed

+1

歡迎來到Stack Overflow。請緊急閱讀[關於]和[問]頁面。請注意,根本不鼓勵要求提供「緊急幫助」的問題。說明中不應包含緊急或同義詞。如果你不需要幫助,你不會問這個問題,所以在標題中請求幫助也等同於同義詞。 –

+3

是否爲所有文件名都固定了尾部的_1.log?你有什麼嘗試?你正在考慮使用哪些命令?你真的應該表現出你的最大努力,解釋爲什麼它不能正常工作,它正在產生什麼以及它應該產生什麼 - 一個MCVE([MCVE])。 –

+1

爲什麼你的組織不允許你使用'sed'?它會允許你使用Awk,Perl,Python,...?爲什麼你不能安裝基於Perl的'prename'命令?爲什麼不首先獲得正確生成的文件名? –

回答

-1

使用日誌從目錄內運行以下內容。

$(ls | sed 's/\([0-9]\{2\}_[0-9]\{2\}_[0-9]\{4\}\)\(.*\)\.log/mv & \2_\1_1.log/') 

$> ls 
27_07_2017file1vc001vpxd-1605.log 
$> $(ls | sed 's/\([0-9]\{2\}_[0-9]\{2\}_[0-9]\{4\}\)\(.*\)\.log/mv & \2_\1_1.log/') 
$> ls 
file1vc001vpxd-1605_file1vc001vpxd-1605_1.log 

編輯:

純的bash溶液,無需使用任何外部工具。

for f in $(ls); do [[ $f =~ ([0-9]{2}_[0-9]{2}_[0-9]{4})(.*)\.log ]] && mv $f "${BASH_REMATCH[2]}_${BASH_REMATCH[1]}_1.log" ; done 

它檢查每個文件名是否與給定的正則表達式匹配。如果匹配,則執行mv命令。

執行正則表達式匹配時,它會捕獲兩個匹配組,因爲它們需要稍後使用。

([0-9]{2}_[0-9]{2}_[0-9]{4})將格式爲dd_dd_dddd的任何內容捕獲到第一組中。 (.*)可以捕捉任何東西。

因此,正則表達式([0-9]{2}_[0-9]{2}_[0-9]{4})(.*)\.log匹配格式爲dd_dd_dddd<anything here>.log的任何文件名。

+0

謝謝, 你可以plz幫我使用mv命令。 我的組織不會允許我使用sed cmd。 我編輯了我的問題,請看看。 是否可以從初始和中間位置開始減少日期,然後是_ 從 27_07_2017file1vc001vpxd-1605.log 27_07_17case2vc001vpxd-9169.log 應該 file1vc001vpxd-1605_27_07_2017_1.log 使用case2vc001vpxd-9169_27_07_17_1.log 「MV」 CMD可能嗎? – Nirmal

+0

@Nirmal我已經更新了答案。這僅適用於您的特定格式。請注意,我已經添加了「_1.log」而不是「.log」,如您在示例中所示。 – Anubis

+0

你有可能解釋你的代碼嗎? 看起來像它會在日期之後首先放點。提取單詞並在我的順序中放置單詞.. ??右 如果日期格式將是27_07_17? for f in $(ls); do [[$ f =〜(。{10})(。*)\。log]] && mv $ f「$ {BASH_REMATCH [2]} _ $ {BASH_REMATCH [1]} _ 1.log」;完成 – Nirmal