删除文件名中的所有括号

删除文件名中的所有括号

我一直在尝试删除文件名中的所有括号。谁能帮我创建一个 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//[][]/}

模式是一个字符类;在字符类中,]如果它是类中的第一个字符,则被视为普通字符,并且[始终被视为普通字符。因此,字符类由][按此顺序组成。

相关内容