重命名目录中的文件

重命名目录中的文件

我的目录中有如下文件名

example1.1.timestamp(.1457644337)
example1.2.timestamp
example1.3.timestamp

等等大约100个文件。我需要通过删除.timestamp(.1457644337)末尾来重命名所有文件。

我设法为单个文件做到这一点

ls -l filename | sed 's/\.[^.]*$//'

答案1

使用renameprename):

  • 如果所有文件的时间戳都相同,则可以从包含文件的目录执行以下操作:

    rename -n 's/\.1457644337$//' example1.*.*
    
  • 对于不同的时间戳:

    rename -n 's/\.\d+$//' example1.*.*
    

递归地:

find . -type f -name 'example1.*.*' -exec rename -n 's/\.\d+$//' {} +

-n如果您对所做的更改感到满意,请删除(试运行)。

请注意,这将删除包含数字(包括 )的最后部分.。因此,如果除了时间戳之外只有任何随机数,它也会被删除。


使用 shell 参数扩展:

  • 如果所有文件的时间戳都相同:

    for file in *.*; do mv -i "$file" "${file%.1457644337}"; done
    
  • 对于不同的时间戳,假设bash(其他高级 shell 有类似的选项):

    shopt -s extglob; for file in *.*; do mv -i "$file" "${file%.+([0-9])}"; done
    

递归地:

find . -type f -name 'example1.*.*' -exec \
    bash -ic 'shopt -s extglob; mv -i "$1" "${1%.+([0-9])}"' _ {} \;

在这里,我使用shell 选项通过使用模式extglob来匹配最后一个之后的数字,因此替换参数扩展模式变为。.+([0-9])${file%.+([0-9])}

同样,这并不严格匹配时间戳。尽管您可以修改模式以获得鲁棒性,如果您有任何精确的时间格式。

答案2

交互式方式,带有视觉检查命令:

ls | vim -

里面vim:

:%s/.*/mv \0 \0/        ...move filename filename
:%s/\.[^.]*$//          ...same as your sed regex
:w !sh                  ...run buffer with shell
:q!                     ...close without saving

相关内容