重命名文件名中的问号 (?)

Mor*_*ton 2 linux bash rename special-characters ubuntu-10.04

有了rename它可以批量修改文件名。我设法+用这个命令摆脱了所有并用下划线替换它们:

rename 's/\+/_/g' * 
Run Code Online (Sandbox Code Playgroud)

我可以将普通字母如 a 更改为 A with。

rename 's/a/A/g' *
Run Code Online (Sandbox Code Playgroud)

但我不能重命名?,不是这样/\?也不是这样/?

有没有办法解决“?” 在文件名中?大多数 FTP 程序也无法重命名文件?。午夜指挥官失败。到目前为止,我发现有效的唯一方法是:

mv ?myfile.txt myfile.txt
Run Code Online (Sandbox Code Playgroud)

但是这个命令不够灵活。我更喜欢批量重命名?所有文件。

For*_*ntr 6

这个怎么样:

for filename in *
do 
    if [ "$filename" == *"?"* ] 
    then
        mv "$filename" "$(echo $filename | tr '?' '-')" 
    fi
done
Run Code Online (Sandbox Code Playgroud)

或者作为一个班轮:

for filename in *; do mv "$filename" "$(echo $filename | tr '?' '-')" ; done
Run Code Online (Sandbox Code Playgroud)

但是,您的问题似乎不是文件名中有问号,而是文件名包含ls无法识别的字符。

  • 不要这样做([为什么你不应该解析 ls(1) 的输出](http://mywiki.wooledge.org/ParsingLs))! (7认同)

Cri*_*itu 5

虽然很丑陋,但它就是这样,一个使用 Python 的单行代码:

python -c 'import os, re; [os.rename(i, re.sub(r"\?", "-", i)) for i in os.listdir(".")]'
Run Code Online (Sandbox Code Playgroud)

至于清理文件名,也许这会对您有所帮助:

python -c 'import os, re; [os.rename(i, unicode(i, "utf-8", "ignore")) for i in os.listdir(".")]'
Run Code Online (Sandbox Code Playgroud)