我一直在尝试删除文件名中的所有括号。谁能帮我创建一个 bash 脚本来做到这一点?
下面的 bash 脚本对于非括号文件名可以完美地工作,但如果有任何括号,它会使文件名加倍:
#!/bin/bash
for fname in *; do
name="${fname%\.*}"
extension="${fname#$name}"
newname="${name//[/}"
newfname="$newname""$extension"
if [ "$fname" != "$newfname" ]; then
#echo mv "$fname" "$newfname"
mv "$fname" "$newfname"
fi
done
示例输出:
$ touch [test]
$ ls
[test] rep.sh
$ bash rep.sh
$ ls
rep.sh test][test]
所以它确实删除了左括号,但重复了文件名。
答案1
我找到了这个衬里和这个作品:
for x in *[*; do mv -- "$x" "${x//[/}"; done
这应该可以完成工作,只需在每次执行此命令时替换左括号或右括号即可
答案2
@juicebyah 发布的解决方案只会删除初始括号。如果OP想去掉两个括号,最好sed
这样使用:
find . -type f -iname "*[*" | \
while IFS= read -r line; \
do mv "$line" "$(printf %s "$line" | sed -re 's/(\[|\])//g')"; done;
答案3
rename
嵌入两行代码中就更简单了:
while rename ] '' *; do true; done
while rename [ '' *; do true; done
rename
将 $3+ 中的文件名中第一次出现的 $1 替换为 $2,并且此块删除所有文件名和目录名中的所有括号连续WD。
答案4
文件名加倍的原因是如果$fname
是[test]
,那么
name="${fname%\.*}"
extension="${fname#$name}"
结果是:
name=[test]
extension=[test]
(解释如下。)稍后,当$extension
与 串联时$newname
,您将得到test][test]
。
你应该使用什么:
name=${fname%.*}
extension=${fname#"$name"}
参数扩展周围的引号是不必要的(在本例中),因为在变量赋值中的参数扩展之后不会发生分词。另外, 没有什么特别的.
,所以不需要反斜杠转义它。
$name
但第二行的引号是必不可少的;如果 的扩展$name
没有被引用,它将被视为一个 glob 模式,并且它的值[test]
将被解释为“单个e, sor t”。这不是 prefix-match $fname
,所以没有这些引号,extension
只是设置为 的值$fname
。
与上述无关,您可以使用以下命令删除名称中的所有括号:
${fname//[][]/}
模式是一个字符类;在字符类中,]
如果它是类中的第一个字符,则被视为普通字符,并且[
始终被视为普通字符。因此,字符类由]
和[
按此顺序组成。