我是脚本新手,我有一个目录,里面的所有文件都名为 num.pdb.ostat。我想重命名所有 num.ostat(即删除所有 .pdb)。对于单个文件,此方法有效:
mv 2.pdb.ostat 2.ostat
但是当我尝试用此脚本对文件夹中的所有文件执行此操作时
for num in ./*; do mv ${num}.pdb.ostat ${num}.ostat; done
什么都没发生
谁能告诉我我哪里错了?
答案1
${num}
取整个文件名。您需要获取不带扩展名的文件名并添加新扩展名。您可以进行字符串格式化。使用以下命令:
for num in ./*; do mv ${num} ${num%.*.*}.ostat ; done
%
从 $string 后面删除 $substring 的最短匹配。
答案2
要对脚本进行故障排除,请尝试将其替换mv
为echo
。您将看到变量${num}
包含满的文件名,例如2.pdb.ostat
。因此你的脚本本质上试图运行
mv ./2.pdb.ostat.pdb.ostat ./2.pdb.ostat.ostat
相反,您必须先将文件名截断为数字。例如
for filename in ./*; do num="$(echo "${filename}" | grep -o '^./[0-9]*')"; echo "${num}.pdb.ostat" "${num}.ostat"; done
一旦确认语法正确,您就可以将 更改echo
为mv
,然后实际移动文件。即
for filename in ./*; do num="$(echo "${filename}" | grep -o '^./[0-9]*')"; mv "${num}.pdb.ostat" "${num}.ostat"; done
不过,最简单的方法是使用(perl)重命名。
rename 's/pdb.//' *.pdb.ostat –
请参阅man rename
以了解更多信息。
答案3
这是一个 bash 脚本,它可以以不太具体的方式完成您想要的操作。
#!/bin/bash
#renext.sh
# a bash script for changing the extension of files.
echo "what extension would you like to change in this directory?"
read oldext
echo "To what?"
read newext
for f in *.*
do
name=$(echo "$f" | sed 's/\.[^\.]*$//')
ext=$(echo "$f" | sed 's/^.*\.//')
target="$name"."$newext"
echo "source file" "$f" is made up of the base "$name" and ends with "$ext"
if [ -e "$target" ];
then
echo "$target" exists. skipping renameing.
else
mv "$f" "$target"
echo changed "$f" to "$target"
fi
done
该脚本不会因文件名带有空格而中断,并允许您选择源和目标扩展名。
它提供了 for 循环的示例,将输入读入变量,使用 sed.
在字符串(文件名)的末尾挑选字符串,如何通过引用变量正确处理空格,检查目标文件是否存在以及根据测试结果进行流控制。它确实向终端发送了不必要的输出,只需删除第 14 行和第 20 行即可消除这些输出,这些行实际上只是用来解释。
答案4
这里有一个基于先前响应的脚本。查找目录中名称包含“伊瓜'然后重命名所有文件,包括正确的扩展名
#!/bin/bash
for file in *Igua*
do
let "i++"
fileext=${file##*.}
mv "$file" "Iguazu_$i.$fileext"
done