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

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

可以rename批量更改文件名。我设法用这个命令删除所有文件+,并用下划线替换它们:

rename 's/\+/_/g' * 

我可以使用以下方法将普通字母(如 a )改为 A 。

rename 's/a/A/g' *

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

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

mv ?myfile.txt myfile.txt

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

答案1

这个怎么样:

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

或者用一行代码来表达:

for filename in *; do mv "$filename" "$(echo $filename | tr '?' '-')" ; done

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

答案2

它很丑陋,但是这里有一个使用 Python 的单行代码:

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

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

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

答案3

使用此代码

for file in ./*;
do
  OUT=`echo $file | sed 's/\r//g'`;
  mv $file $OUT;
done

显然与 sed\r匹配。?

答案4

这可能有点小题大做,但是使用此答案中提供的链接中的 bash 脚本,您可以使用其中的任何字符(包括问号、换行符、多字节字符、空格、破折号和任何其他允许的字符)重命名文件名:

https://superuser.com/a/858671/365691

相关内容