我正在尝试创建一个小型Bash脚本,以从文件名中删除连字符。 例如,我想将以下名称重命名:
CropDamageVO-041412.mpg
为
CropDamageVO041412.mpg
我是Bash新手,请温柔点:] 谢谢您的帮助
CropDamageVO-041412.mpg
为
CropDamageVO041412.mpg
我是Bash新手,请温柔点:] 谢谢您的帮助
试试这个:
for file in $(find dirWithDashedFiles -type f -iname '*-*'); do
mv $file ${file//-/}
done
假设您的目录名称中没有破折号,否则此方法会出现问题。
在这里有关于${varname//regex/replacementText}
语法的解释,可以搜索子字符串替换。
如果您的目录或文件名中有空格,那么上述方法也会失效。您应该使用以下方法来处理包含空格的文件名:
for file in *-*; do
mv $file "${file//-/}"
done
这种方法的缺点是必须在包含要更改文件的每个目录中运行,但正如我所说,它更加健壮。
FN=CropDamageVO-041412.mpg
mv $FN `echo $FN | sed -e 's/-//g'`
反引号(``)告诉bash在其中运行命令,并在表达式中使用该命令的输出。 sed部分应用正则表达式来从文件名中删除连字符。
或者对于匹配特定模式的当前目录中的所有文件执行此操作:
for i in *VO-*.mpg
do
mv $i `echo $i | sed -e 's/-//g'`
done
去除字符串中连字符的通用解决方案:
$ echo "remove-all-hyphens" | tr -d '-'
removeallhyphens
$
f=CropDamageVO-041412.mpg
echo "${f//-}"
mv "$f" "${f//-}"
mv "$file" "${file//-/}"
)。 - Gordon Davissonfind
的输出,尤其是不要使用for
循环:因为文件名中有空格或通配符字符,你的语句会出错。如果你想继续使用find
,请使用更健壮的方法,例如find dirWithDashedFiles -type f -name '*-*' -exec bash -c 'mv "$f" "${f//-}"' - {} \;
(注意当替换字符串为空时,尾部斜杠是可选的)。 - gniourf_gniourf