我不小心用错误的编码复制了文件,所以文件和文件夹名称似乎用octl编码,而不是utf-8,例如,它们被称为L334ten.txt
而不是Löten.txt
。我想(至少(找到所有受影响的文件和文件夹,理想情况下我能够自动重命名文件(因此334
到ö
,依此类推(。如果可以选择更改编码,当然也可以。Bash解决方案是最好的,但我对使用python或类似的东西持开放态度。
我尝试使用grep/find来识别文件/文件夹,但遗憾的是没有任何运气。
快速而肮脏的oneliner:
for file in $(find . -regextype posix-extended -regex ".*[][0-9]{3}.*");
do
OLD_NAME=$(basename $file);
NEW_NAME=$(echo $OLD_NAME |
sed 's/\337/ß/g' |
sed 's/\344/ä/g' |
sed 's/\366/ö/g' |
sed 's/\374/ü/g');
mv $file $(dirname $file)/$NEW_NAME;
done
证明:
$ touch 'W344rme.txt' 'L366ten.txt' 'l366tf344hige.txt'
$ ls
'L366ten.txt' 'l366tf344hige.txt' 'W344rme.txt'
$ copy_paste_oneliner_here
$ ls
Löten.txt lötfähige.txt Wärme.txt
更新:
@rt87如果我理解你的评论,有可能模仿你奇怪的文件名:
$ touch $(echo "Löten.txt" | iconv -f UTF-8 -t ISO-8859-1)
因此,现在我们有一个UTF-8区域设置的编码名称不正确的文件-L�ten.txt
。在终端中,您可以看到:
$ ls
'L'$'366''ten.txt'
因此,您可以使用另一个oneliner:取回您的文件
for file in *.*; do mv "$file" "$(echo $file | iconv -f ISO-8859-1 -t UTF-8)"; done
在我们的测试中,我们得到了:
$ ls
Löten.txt