如何重命名具有不同扩展名的文件

如何重命名具有不同扩展名的文件

假设我有这些文件:

essay.aux                   essay.out
essay.dvi                   essay.pdf
essay.fdb_latexmk           essay.tex
essay.fls                   essay.toc
essay.log                   ......

我如何将它们重命名为:

new_name.aux                new_name.out
new_name.dvi                new_name.pdf
new_name.fdb_latexmk        new_name.tex
new_name.fls                new_name.toc
new_name.log                ......

问题是它们有不同的扩展名而不是不同的名称,所以我不能使用来自这个问题。另外,我使用的是 macOS,它没有rename命令。

答案1

这是我能够使用的解决方案:

#!/bin/bash
shopt -s nullglob

my_files='/root/temp/files'
old_name='essay'
new_name='new_name'

for file in "${my_files}/${old_name}"*; do
    my_extension="${file##*.}"
    mv "$file" "${my_files}/${new_name}.${my_extension}"
done
  • shopt -s nullglob

如果解析的目录为空,这将防止出现错误

  • for file in "${my_files}/${old_name}"*; do

我们将循环遍历每个filein /root/temp/files/,只要它以essay

  • my_extension="${file##*.}"

这将贪婪地修剪任何东西最后的 .在文件名中找到(希望只留下扩展名)

  • mv "$file" "${my_files}/${new_name}.${my_extension}"

这会将旧文件移动到新文件名,同时保留扩展名。 (改名)

答案2

您还可以使用查找:

 find . -name "essay.*" -exec sh -c 'mv $1 new_name.${1##*.}' rename {} \;

答案3

如果您使用 zsh,您可以这样做:

autoload zmv
zmv -w 'essay.*' 'new_name.$1'

礼貌地这个答案

答案4

我使用下面的命令来获取输出

首先,我在循环中使用了 for 循环for,我提到了所有文件扩展名,然后在循环中我使用awk命令根据要求重命名文件。

测试并运行良好

命令

for i in aux out dvi pdf fdb_latexmk tex fls toc; do  find . -type f -iname "*.$i"| awk -F "./" '{print $2}' | awk -F "." '{print "mv" " " $1"."$2 " " "new_name."$2}'| sh; done

相关内容