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

时间:2018-09-14 16:55:31

标签: utf-8 filenames iso-8859-1 iconv

  1. 从Linux Mint Cinammon更改为Mint KDE会导致某些问题 所有分区的文件名字符集!现在的名字是 一团糟。我已经尝试更改语言区域,但未成功
  2. 问题与重音符号有关(我是巴西人 葡萄牙语使用者)
  3. 最大的问题是我必须处理大约60GB +的 60.000+个文件(主要是PDF),位于fat32分区中的1000+个文件夹和子文件夹中
  4. 所以我在Internet上找到了这个对我来说很好的命令行, 但它缺少递归功能,即它不适用 更改子文件夹,以及子文件夹中包含的文件。它 只需应用所需的更改(即:从一个文件重命名 char设置为另一个)到实际的普通单个文件夹

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

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

1 个答案:

答案 0 :(得分: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' -- {} \;