命令行以递归方式从文件名批量更改字符集(UTF-8-Latin1)

问题描述 投票:0回答:1
  1. 从Linux Mint Cinnamon更改为Mint KDE会导致所有分区的文件名为char集!现在这些名字都搞砸了。我已经尝试更改区域设置,但未成功
  2. 问题涉及重音字符(我是巴西葡萄牙语的人)
  3. 最大的问题是我必须在fat32分区中的1000多个文件夹和子文件夹中处理大约60GB + 60,000多个文件(主要是PDF)
  4. 所以我在互联网上发现这个命令行对我来说很好,但它没有递归功能,即它不会对子文件夹和子文件夹中包含的文件应用更改。它只是将所需的更改(即:将文件从一个字符集重命名为另一个字符集)应用于实际的普通单个文件夹

我的问题是:如何将此命令行递归?它甚至可能吗?

ls -1 | while read arquivo ; do novo="`echo $arquivo \
| iconv -f UTF-8 -t ISO-8859-1`"; if [ "$novo" != "$arquivo" ] ;\
then mv "$arquivo" "$novo"; fi done
utf-8 filenames iso-8859-1 iconv
1个回答
0
投票

这应该做的伎俩:

find . -type f -exec bash -c 'novo="`echo $1 \                                
| iconv -f UTF-8 -t ISO-8859-1`"; if [ "$novo" != "$1" ] ;\
then mv "$1" "$novo"; fi' -- {} \

您可以将.更改为任何适当的目录,并使用-name按名称过滤文件,请参阅man find

要仅影响以.pdf结尾的文件,您可以使用

find . -type f -name '*.pdf' -exec bash -c 'novo="`echo $1 \                                
| iconv -f UTF-8 -t ISO-8859-1`"; if [ "$novo" != "$1" ] ;\
then mv "$1" "$novo"; fi' -- {} \

单行复印和粘贴:

find . -type f -exec bash -c 'novo="`echo $1 | iconv -f UTF-8 -t ISO-8859-    1`"; f [ "$novo" != "$1" ] ; then mv "$1" "$novo"; fi' -- {} \;
© www.soinside.com 2019 - 2024. All rights reserved.