如何查找(和重命名)具有八进制字符的文件和文件夹名称



我不小心用错误的编码复制了文件,所以文件和文件夹名称似乎用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

最新更新