Командная строка для рекурсивного массового изменения кодировки из имен файлов (UTF-8-Latin1)

  1. Переход с Linux Mint Cinammon на Mint KDE вызывает что-то с наборами символов имен файлов всех разделов! Теперь перепутались имена. Я уже пробовал менять локали, безуспешно
  2. Проблема касается символов с акцентом (я говорю на бразильском португальском языке)
  3. Большая проблема заключается в том, что мне приходится иметь дело примерно с 60 ГБ+ 60 000+ файлов (в основном PDF) в 1000+ папках и подпапках в разделе FAT32.
  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

person José Paulo Maldonado    schedule 14.09.2018    source источник
comment
stackoverflow.com/ вопросы/9393607/   -  person Yasin    schedule 14.09.2018
comment
Извините, но это не тот случай, или я не могу понять, как это можно применить к этому случаю.   -  person José Paulo Maldonado    schedule 14.09.2018


Ответы (1)


Это должно помочь:

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' -- {} \;
person rkta    schedule 15.09.2018
comment
Пробовал это, да! 1) это рекурсивно, 2) сделать свое дело. Но... мой вывод был таким для всех файлов (br-portuguese). Я что-то упускаю? mv: não foi possível mover './.local/share/Trash/files/2017.2/ética livros novos/SINGER, P. Ã'$'\302\211''tica prática.pdf' para '. /.local/share/Trash/files/2017.2/ética livros novos/SINGER, P. Ética prática.pdf': Arquivo ou diretório não encontrado Набирается следующим образом: find . -type f -exec bash -c 'novo=echo $1 | iconv -f UTF-8 -t ISO-8859-1; если [ $ново != $1 ] ; затем mv $1 $novo; фи' -- {} \; - person José Paulo Maldonado; 15.09.2018
comment
Извините, rkta, я все еще тестирую командную строку. Просто пытался указать папку и расширение, без особого успеха. Мои чувства говорят, что это правильный путь, спасибо, я скоро оставлю комментарий, показывающий мои конкретные результаты и прошу дальнейшей помощи или улучшения !! - person José Paulo Maldonado; 18.09.2018
comment
Я только что создал эту команду, моя проблема решена: convmv -r --notest -f windows-1252 -t UTF-8 * . Спасибо! - person José Paulo Maldonado; 25.09.2018