Unix:使用动态扩展名重命名文件

时间:2016-07-04 13:02:51

标签: regex linux unix rename

我正在使用RHEL 5.10,我试图从一堆文件中删除动态日期扩展。

文件格式类似于filename01.gz.20160704,其中最后一部分date是动态的。我希望将其重命名为filename01.gz

当我尝试重命名如下时,它可以正常工作

rename   gz.20160704   gz   filename01.gz.20160704

输出:filename01.gz

但是,当我尝试重命名时,它不起作用

rename  gz.*  gz  filename01.gz.20160704

我尝试搜索其他答案,在其中一些答案中,他们使用了如下所示的重命名,但遗憾的是,这对我来说也不起作用。

rename 's/gz*/gz/' filename01.gz.20160704   
rename 's/gz.*/gz/' filename01.gz.20160704  

我的linux的man页面说

For example, given the files foo1, ..., foo9, foo10, ..., foo278, the commands
          rename foo foo0 foo?
          rename foo foo0 foo??

有人可以帮助我吗,或者我可以使用其他方法吗?

更新:添加了@PSkocik提供的解决方案,但它也无法正常工作。

$> ls -ltr filename01*
-rw-rw----+ 1 foo foo 0 Jul  4 08:34 filename01.gz.20160704
$> rename -n 's/\.gz\.[^.]*/.gz/' filename01.gz.*
$> echo $?
0
$> ls -ltr filename01*
-rw-rw----+ 1 foo foo 0 Jul  4 08:34 filename01.gz.20160704

1 个答案:

答案 0 :(得分:1)

  1. prename(perl-rename):

    rename -n 's/\.gz\.[^.]*/.gz/' filename01.gz.*   
    
  2. 使用mv和POSIX shell:

    for f in *.gz.*; do mv "$f" "${f%.*}"; done