我是脚本编写新手,我有一个目录,其中包含所有名为 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 的最短匹配项。
要对脚本进行故障排除,请尝试替换mv
为echo
. 您会看到您的变量${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
更多信息。