消除 '?'单个目录中多个文件名的字符

消除 '?'单个目录中多个文件名的字符

我的目录中有许多文件的名称包含?, 我想删除这些?字符。

你能帮我吗?

答案1

rename 's/\?//g' *

谁来重命名所有文件

francois@zaphod:~/tmp$ ls
toto_?_  toto_?_1  toto_?_2

francois@zaphod:~/tmp$ rename 's/\?//g' *
francois@zaphod:~/tmp$ ls
toto__  toto__1  toto__2
francois@zaphod:~/tmp$

答案2

假设或任何类似的 shell 知道如何用(例如或)bash替换与变量值中的模式匹配的所有出现的字符串:${variable//pattern/replacement}zshksh

for name in ./*'?'*; do
    mv -i "$name" "${name//'?'/}"
done

这是一个短循环,迭代当前目录中至少包含一个的所有名称?(跳过隐藏名称)。对于每个这样的名称,?将从文件名中删除字符,并将结果用作文件的新文件名。

模式中的单引号?阻止它被视为与任何单个字符匹配的特殊通配字符(这就是不带引号的作用?)。您也可以使用\?[?]

如果您看到的问号来自 的输出ls,那么它们可能代表不可打印的字符。

去除这些'?',将上面代码中的每个替换为[![:print:]].通配模式[![:print:]]匹配不可打印的字符。字符[:print:]类与 类似[:graph:],但前者匹配空格字符,后者不匹配。使用[![:print:]]不是删除空格,而使用[![:graph:]]会删除空格。

相关内容