在Bash中批量重命名文件

问题描述:

我在一个目录中有多个文件,格式如下,其中开始日期和.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'命令?为什么不首先获得正确生成的文件名? –

使用日志从目录内运行以下内容。

$(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