假设我有这些文件:
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
我们将循环遍历每个file
in /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
答案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