重命名目录中的所有文件扩展名

Dit*_*tte 4 bash rename

我是脚本编写新手,我有一个目录,其中包含所有名为 num.pdb.ostat 的文件。我想重命名所有 num.ostat (即全部删除 .pdb)。对于单个文件,这有效:

mv 2.pdb.ostat 2.ostat
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用此脚本对文件夹中的所有文件执行此操作时

for num in ./*; do mv ${num}.pdb.ostat ${num}.ostat; done
Run Code Online (Sandbox Code Playgroud)

没发生什么事

谁能告诉我,我哪里出错了?

小智 6

${num}获取整个文件名。您需要获取没有扩展名的文件名并添加新的扩展名。您可以进行字符串格式化。使用以下命令:

for num in ./*; do mv ${num} ${num%.*.*}.ostat ; done
Run Code Online (Sandbox Code Playgroud)

% 从 $string 后面删除 $substring 的最短匹配项。

  • +1 我总是忘记参数替换。这不适用于其中包含空格的文件,但适用于这个问题。此外,您可以使用贪婪表达式`${num%%.*}.ostat` 代替,并保存一个字符!:) (2认同)

Spa*_*awk 5

要对脚本进行故障排除,请尝试替换mvecho. 您会看到您的变量${num}包含完整的文件名,例如2.pdb.ostat. 因此你的脚本基本上试图运行

mv ./2.pdb.ostat.pdb.ostat ./2.pdb.ostat.ostat
Run Code Online (Sandbox Code Playgroud)

相反,您必须先将文件名截断回仅数字。例如

for filename in ./*; do num="$(echo "${filename}" | grep -o '^./[0-9]*')"; echo "${num}.pdb.ostat" "${num}.ostat"; done
Run Code Online (Sandbox Code Playgroud)

确认语法没问题后,您可以将 更改echo为 a mv,然后实际移动文件。IE

for filename in ./*; do num="$(echo "${filename}" | grep -o '^./[0-9]*')"; mv "${num}.pdb.ostat" "${num}.ostat"; done
Run Code Online (Sandbox Code Playgroud)

不过,最简单的方法是使用 (perl) 重命名。

rename 's/pdb.//' *.pdb.ostat –
Run Code Online (Sandbox Code Playgroud)

查看man rename更多信息。