在 Linux 中根据模式重命名文件名

在 Linux 中根据模式重命名文件名

我有很多文件名如下的数据:

combination.2005.0801.txt
combination.2005.0802.txt 
...
combination.2005.0830. txt

如果我想将该文件重命名为这样的名称,该怎么办?

20100801.txt  
20100802.txt
...
20100803.txt

我已经尝试使用以下脚本,但不幸的是该脚本不起作用。

rename 's/combination.(.*).(.*).txt/$1.txt/' *.txt

答案1

当使用(Perl 兼容;或更通用,大多数)正则表达式时,您必须记住.将匹配任何字符;不仅仅是句点(而且除非有量词,否则只有一个字符)。

以下未经测试,但我可能会尝试使用此解决方案基于这个问题和答案

$ for old in ./combination*.txt; do
    new=$(echo $old | sed -r 's/combination\.([[:digit:]]+)\.([[:digit:]]+)\.txt$/\\1\\2.txt/')
    mv -v "$old" "$new"
  done

请记住,这尚未经过测试,可能会出现问题。您也可以先使用echo而不是mv测试整个过程。:)

答案2

$ for i in combination*.txt; do
   mv $i $(echo $i | awk -F\. '{print $2$3"."$4}'); 

done

相关内容