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

使用Bash从文件名中删除连字符,bash,shell,rename,Bash,Shell,Rename,我正在尝试创建一个小Bash脚本来删除文件名中的连字符。例如,我想重命名: CropDamageVO-041412.mpg 到 CropDamageVO041412.mpg 我是Bash的新手,所以要温柔:]谢谢你的帮助 FN=CropDamageVO-041412.mpg mv $FN `echo $FN | sed -e 's/-//g'` backticks(``)告诉bash在它们内部运行命令,并在表达式中使用该命令的输出。sed部分应用正则表达式从文件名中删除连字符 或者对当前目录中

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

CropDamageVO-041412.mpg

CropDamageVO041412.mpg

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

FN=CropDamageVO-041412.mpg
mv $FN `echo $FN | sed -e 's/-//g'`
backticks(``)告诉bash在它们内部运行命令,并在表达式中使用该命令的输出。sed部分应用正则表达式从文件名中删除连字符

或者对当前目录中与特定模式匹配的所有文件执行此操作:

for i in *VO-*.mpg
do
    mv $i `echo $i | sed -e 's/-//g'`
done
或者,当然

mv "$f" "${f//-}"
试试这个:

for file in $(find dirWithDashedFiles -type f -iname '*-*'); do
  mv $file ${file//-/}
done
这是假设您的目录名称中没有破折号。这将打破这一局面

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

此外,如果目录或文件名中有空格,则会中断。如果文件名中有空格,则应使用:

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

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

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

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

这确实具有通用Posix shell兼容性的优点。我从不确定我是否应该喝下所有的bash kool-aid。事实上,这就是我养成了避免花式bash主义的习惯,以至于我现在很少使用古董贝壳时也不会真正使用它们。Solaris和AIX有很多问题需要解决……哇,这是一个快速的回答。我应该指定我正在尝试以:[NAME]VO-[DATE].mpgNo的格式删除大量文件中的连字符。如果你想了解更多关于bash的知识,这是一个很好的指南,虽然相当枯燥。太完美了!我非常感激!你刚才让我的工作更轻松了如果文件名中可能有空格,你需要双引号$file(即
mv“$file”“${file/-/}”
)@GordonDavisson很好。更新了我的答案。不要解析
find
的输出,当然也不要使用
for
循环:按照原样,您的语句在文件名中以空格或全局字符分隔。如果您想继续使用
find
使用一种更健壮的方法,例如,
find dirWithDashedFiles-type f-name'*-*'-exec bash-c'mv“$f”“${f/-}'-{}”(请注意,替换字符串为空时,尾随斜杠是可选的)。
$ echo "remove-all-hyphens" | tr -d '-'
removeallhyphens
$