【发布时间】:2012-04-26 20:56:38
【问题描述】:
我正在尝试创建一个小型 Bash 脚本来删除文件名中的连字符。比如我要重命名:
CropDamageVO-041412.mpg
到
CropDamageVO041412.mpg
我是 Bash 新手,所以要温柔 :] 谢谢你的帮助
【问题讨论】:
我正在尝试创建一个小型 Bash 脚本来删除文件名中的连字符。比如我要重命名:
CropDamageVO-041412.mpg
到
CropDamageVO041412.mpg
我是 Bash 新手,所以要温柔 :] 谢谢你的帮助
【问题讨论】:
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
【讨论】:
f=CropDamageVO-041412.mpg
echo "${f//-}"
或者,当然,
mv "$f" "${f//-}"
【讨论】:
试试这个:
for file in $(find dirWithDashedFiles -type f -iname '*-*'); do
mv $file ${file//-/}
done
这是假设您的目录名称中没有破折号。那会打破这个。
${varname//regex/replacementText} 语法解释为here。只需搜索子字符串替换。
此外,如果您的目录或文件名中有空格,这会中断。如果你的文件名中有空格,你应该使用这个:
for file in *-*; do
mv $file "${file//-/}"
done
这样做的缺点是必须在包含您要更改的文件的每个目录中运行,但是,就像我说的,它更健壮一些。
【讨论】:
mv "$file" "${file//-/}")
find 的输出,当然也不要使用 for 循环:因为原样,您的语句会在文件名中出现空格或全局字符。如果您想坚持使用find,请使用更强大的方法,例如find dirWithDashedFiles -type f -name '*-*' -exec bash -c 'mv "$f" "${f//-}"' - {} \;(请注意,当替换字符串为空时,尾部斜杠是可选的)。
从任何字符串中删除连字符的通用解决方案:
$ echo "remove-all-hyphens" | tr -d '-'
removeallhyphens
$
【讨论】: