2

我正在尝试创建一个小的 Bash 脚本来从文件名中删除连字符。例如,我想重命名:

CropDamageVO-041412.mpg

CropDamageVO041412.mpg

我是 Bash 的新手,所以要温柔 :] 谢谢你的帮助

4

4 回答 4

13

尝试这个:

for file in $(find dirWithDashedFiles -type f -iname '*-*'); do
  mv $file ${file//-/}
done

这是假设您的目录名称中没有破折号。那会打破这个。

这里解释${varname//regex/replacementText}语法。只需搜索子字符串替换。

此外,如果您的目录或文件名中有空格,这会中断。如果你的文件名中有空格,你应该使用这个:

for file in *-*; do
  mv $file "${file//-/}"
done

这样做的缺点是必须在每个包含您要更改的文件的目录中运行,但是,就像我说的,它更健壮一些。

于 2012-04-15T01:01:07.830 回答
5
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
于 2012-04-15T00:58:44.420 回答
2
f=CropDamageVO-041412.mpg
echo "${f//-}"

或者,当然,

mv "$f" "${f//-}"
于 2012-04-15T01:00:51.290 回答
1

从任何字符串中删除连字符的通用解决方案:

$ echo "remove-all-hyphens" | tr -d '-'
removeallhyphens
$
于 2020-11-29T09:55:32.240 回答