使用Bash从文件名中删除连字符

5
我正在尝试创建一个小型Bash脚本,以从文件名中删除连字符。 例如,我想将以下名称重命名:
CropDamageVO-041412.mpg

CropDamageVO041412.mpg
我是Bash新手,请温柔点:] 谢谢您的帮助
4个回答

15

试试这个:

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

假设您的目录名称中没有破折号,否则此方法会出现问题。

这里有关于${varname//regex/replacementText}语法的解释,可以搜索子字符串替换。

如果您的目录或文件名中有空格,那么上述方法也会失效。您应该使用以下方法来处理包含空格的文件名:

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

这种方法的缺点是必须在包含要更改文件的每个目录中运行,但正如我所说,它更加健壮。


1
如果文件名中可能包含空格,则需要对$file进行双引号处理(即mv "$file" "${file//-/}")。 - Gordon Davisson
不要解析find的输出,尤其是不要使用for循环:因为文件名中有空格或通配符字符,你的语句会出错。如果你想继续使用find,请使用更健壮的方法,例如find dirWithDashedFiles -type f -name '*-*' -exec bash -c 'mv "$f" "${f//-}"' - {} \;(注意当替换字符串为空时,尾部斜杠是可选的)。 - gniourf_gniourf

6
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

这样做的优点是具有通用的 Posix-shell 兼容性。我从来不确定是否应该喝下 所有 的 bash kool-aid。 - DigitalRoss
确实,这就是我养成避免使用花哨的bash-isms的习惯的原因,以至于即使现在很少使用古老的shell时,我也不太使用它们。Solaris和AIX有很多问题要解决... - jimw
哇,回复好快啊。我应该指明我试图删除多个文件中的连字符,格式为:[名称]VO-[日期].mpg - idoperceive
说干就干。如果你想更多地了解bash,http://tldp.org/LDP/abs/html/是一个很好的指南,虽然有点枯燥无味。 - jimw
太完美了!我非常感激!你让我的工作变得更容易了。 - idoperceive

3

去除字符串中连字符的通用解决方案:

$ echo "remove-all-hyphens" | tr -d '-'
removeallhyphens
$

3
f=CropDamageVO-041412.mpg
echo "${f//-}"

当然,或者说
mv "$f" "${f//-}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接