![消除 '?'单个目录中多个文件名的字符](https://linux22.com/image/12978/%E6%B6%88%E9%99%A4%20'%EF%BC%9F'%E5%8D%95%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B8%AD%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E5%AD%97%E7%AC%A6.png)
我的目录中有许多文件的名称包含?
, 我想删除这些?
字符。
你能帮我吗?
答案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}
zsh
ksh
for name in ./*'?'*; do
mv -i "$name" "${name//'?'/}"
done
这是一个短循环,迭代当前目录中至少包含一个的所有名称?
(跳过隐藏名称)。对于每个这样的名称,?
将从文件名中删除字符,并将结果用作文件的新文件名。
模式中的单引号?
阻止它被视为与任何单个字符匹配的特殊通配字符(这就是不带引号的作用?
)。您也可以使用\?
或[?]
。
如果您看到的问号来自 的输出ls
,那么它们可能代表不可打印的字符。
去除这些'?'
,将上面代码中的每个替换为[![:print:]]
.通配模式[![:print:]]
匹配不可打印的字符。字符[:print:]
类与 类似[:graph:]
,但前者匹配空格字符,后者不匹配。使用[![:print:]]
会不是删除空格,而使用[![:graph:]]
会删除空格。