Linux конвертировать имена файлов

Перекодировка имён файлов и директорий на файловом сервере

Задача следующая. Имеется файловый сервер, в котором все файлы и директории имеют имена в кодировке cp-1251. Требуется быстро и без лишних заморочек конвертировать их в другую кодировку, например в utf-8. Операционна система Linux.

Как оказалось, всё элементарно и просто 🙂

Для этого нам понадобится утилита convmv. Скачать её можно отсюда. На момент написания статейки, последняя её версия была 1.14. В архиве прилагается уже скомпилированный вариант, который можно сохранить в директорию /usr/local/bin, либо запускать с любого места.

Параметры командной строки convmv:

# ./convmv --help Your Perl version has fleas #22111 #37757 #49830 convmv 1.14 - converts filenames from one encoding to another Copyright (C) 2003-2008 Bjoern JACKE <bjoern@j3e.de> This program comes with ABSOLUTELY NO WARRANTY; it may be copied or modified under the terms of the GNU General Public License version 2 or 3 as published by the Free Software Foundation. USAGE: convmv [options] FILE(S) -f enc encoding *from* which should be converted -t enc encoding *to* which should be converted -r recursively go through directories -i interactive mode (ask for each action) --nfc target files will be normalization form C for UTF-8 (Linux etc.) --nfd target files will be normalization form D for UTF-8 (OS X etc.) --qfrom be quiet about the "from" of a rename (if it screws up your terminal e.g.) --qto be quiet about the "to" of a rename (if it screws up your terminal e.g.) --exec c execute command instead of rename (use #1 and #2 and see man page) --list list all available encodings --lowmem keep memory footprint low (see man page) --nosmart ignore if files already seem to be UTF-8 and convert if posible --notest actually do rename the files --replace will replace files if they are equal --unescape convert%20ugly%20escape%20sequences --upper turn to upper case --lower turn to lower case --parsable write a parsable todo list (see man page) --help print this help

Предположим, что содержимое файлового сервера расположено в каталоге /home/ftp , тогда для конвертации имён файлов и директорий из кодировки cp-1251 в utf-8:

Источник

LinuxSoID

Часто бывает, что в системе остаются такие артефакты, как файлы,
имя которых записано в кодировке koi8-r или cp1251.
Обычно такое случается, когда раздел или устройство с которого были скопированы файлы, были смонтированы без указания кодировки, или с указанием неверной кодировки.
Выглядит все это вот так:
# ls
. 1 . 3

Читайте также:  Linux copy folder to remote host

Чтобы легко и просто переделать имя файла в читабельный вид, можно воспользоваться утилитой convmv.
Если у вас имена файлов в кодировке koi8-r, то перекодировать их можно так:
convmv -t koi8-r -f utf8 * — выведет список файлов в старой и в новой кодировках:

# convmv -f koi8-r -t utf8 *
Starting a dry run without changes.
mv «./����1» «./Файл1»
mv «./����3» «./Файл3»

И если вас это устраивает, добавляем опцию —notest и программа уже реально переименует файлы:

convmv -f koi8-r -t utf8 —notest *

Convmv поддерживает также кучу дополнительных полезных опций:
—list Покажет список поддерживаемых кодировок.
-r Рекурсивно обойти каталоги.
-i Спрашивать о каждом действии (интерактивный режим).
—lower Переделывает имя файла в нижний регистр

convmv -r -f koi8-r -t utf-8 —notest

Каждому пользователю, в домашнем каталоге которого утилита convmv переименовала хотя бы один файл, был автоматически выслан журнал переименований.

При необходимости можно выполнить обратное преобразование:

После проверки вывода команды повторить с ключем —notest. Ключ -r включает рекурсивный обход каталогов.

Переходим в папку с файлами/папками с отличной от системной кодировкой, затем выполняем:
% convmv -f cp1251 -t utf-8 ./
Конвертируем имена из cp1251 в utf-8, вывод этой команды покажет новое имя файла/папки, но не будет переименовывать, если новое имя правильное, то запустим эту же команду с опцией —notest.
Для рекурсивного переименования запускаем convmv с опцией -r.

(Замените koi8-r кодировкой, с которой хотите конвертировать)
# convmv -f koi8-r -t utf-8 filename

Вот пример конвертирования в папке рекурсивно:
convmv -f koi8-r -t utf-8 ./Music —notest -r

Источник

Linux bash: Convert filenames recursively from ISO-8859-1 (or other) to UTF-8 and vice versa

Monero Badge: QR-Code

Information
This article explains the basic usage to convert ISO to UTF-8 charsets. If you are searching for a sophisticated script check out this page also:

Convert filenames from ISO → UTF-8

convmv -f iso-8859-1 -t utf8 -r ./*

[ this command just shows you what it would do. To actually apply the conversion add the parameter —notest ]

Convert filenames from UTF-8 → ISO

convmv -f utf8 -t iso-8859-1 -r ./*

[ this command just shows you what it would do. To actually apply the conversion add the parameter ‐‐notest ]

Details explained

  • convmv: A tool you might need to download and install first. (in Debian enter this on your console: aptitude install convmv)
  • parameter «-f» : convert from charset XYZ (see man convmv)
  • parameter «-t»: convert to charset XYZ (see man convmv)
  • parameter «-r»: convert recursively (all files in all subdirectories)
  • parameter «./*»: start conversion in the current directory. You may enter a target directory here like /home/myroot/myfiles
  • parameter «‐‐notest»: apply this to actually start the conversion. Without it the command will just show what it would do
Читайте также:  Узнать md5 файла linux

Источник

Перекодировка файлов в Unix

Иногда, я бы даже сказал достаточно часто приходится заниматься перекодировкой файлов или названий файлов в ОС Unix. Хорошо когда у вас есть графический интерфейс и редактор типа kate, который позволяет без проблем конвертировать кодировки файлов. А если надо перекодировать название файлов? Или перекодировать само содержание файлов без графического интерфейса? Тут уже в помощь приходят команды Unix. И поверьте, набрать команду в консоле намного быстрее чем запускать какие-то редакторы кодировок и графические перекодировщики. А если для наиболее популярных перекодировок файлов написать исполняемые файлы с названием типа win2utf, то жизнь за консолью вам покажется очень простой 🙂

Перекодировка названий файлов

В данном примере приведу перекодировку из UTF8 в KOI8-R.
Скачиваем и устанавливаем программу convmv. Если в вашем репозитории данного пакета не обнаружилось, то скачать исходники можно отсюда.
Переходим в каталог, где нам надо изменить название файлов и вводим команду

./downloads/Сборник песен - Братушки подводники# ./convmv -t KOI8-R -f UTF-8 * Starting a dry run without changes. mv "./п═п╣п╩п╦пЁп╦я▐ п©п╬п╢п╡п╬п╢п╫п╦п╨п╟.mp3" "./Религия подводника.mp3" mv "./п▓ п╠п╟п╥я┐.mp3" "./В базу.mp3" 

Если после выполнения команды можно прочесть название файлов, тогда делаем окончательную перекодировку, добавляя в конец команды “–notest”. Сделано это для того чтобы пользователь еще больше не закодировал итак непонятные символы. А вдруг вы ошиблись в исходной или конечной кодировке?
Теперь команда будет выглядеть

convmv -t KOI8-R -f UTF-8 *--notest

Если надо перекодировать рекурсивно каталоги, то добавляем в строку ключик -r и тогда можно за один проход перекодировать всю директорию с вложенными папками и подпапками. Остальные ключи программы можно посмотреть через команду

Перекодировка содержимого файлов

Чтобы не использовать графические редакторы можно использовать консольную программу перекодировщик, например такую как recode. Я считаю, что данная программа имеет очень логичный интерфейс и достаточно хорошо справляется с возложенной на нее задачей. Сначала установим программу recode, т.к. данная программа не входит в обязательный набор программ многих дистрибутивов.
Вот пример перекодировки файла из кодировки windows 1251 в utf8.

Опасность действий с recode поджидает тех, кто невнимателен, т.к. содержимое файла изменяется сразу же после команды. Заранее делайте копию перекодируемого файла, или делайте обратную перекодировку в том случае если ошиблись.

Также для перекодировки содержимого файла можно использовать команду iconv. Синтаксис данной команды немного посложнее. Пример перекодировки из windows 1251 в utf8.

iconv -c -f windows-1251 -t UTF-8 имя_исходного_файла > имя_нового_файла

Обратите внимание на то, что в команде recode надо использовалась указание кодировки windows1251 слитно, а в iconv надо писать через дефис.

Преимущество команды iconv в том, что она есть почти в каждом дистрибутиве unix и возможность создать новый выходной файл.

Ну и напоследок приведу пример скрипта, с помощью которого можно перекодировать название файлов из koi8r в utf8 с помощью recode.

#!/bin/sh IFS=$'\n' for x in `ls` do echo $x mv "$x" `echo $x | recode koi8r..u8` done 

Перекодировка содержимого файла в транслит

Инсталлируем пакет yudit. Из всего пакета нам потребуется только утилита uniconv. Данная утилита имеет не совсем привычный синтаксис, но вполне подойдет для наших целей если задействовать вокруг неё команды unix

cat ./readme_koi8r | uniconv -decode koi8-r -encode Russian-Translit > ./readme_translit

На выходе получаем файл с латиницей, а входной файл был в кодировке KOI8-R.

Читайте также:  Настройка сети astra linux orel

Многие действия команд convmv, recode, iconv и uniconv имеют много общего и фактически делают одно и то же. Так что используйте их в зависимости от вашего настроения и ситуации. И не забывайте про составление скриптов из этих команд.

Похожие статьи:

Запись опубликована в рубрике Программы с метками freebsd, linux, команды linux. Добавьте в закладки постоянную ссылку.

Источник

Смена кодировки имен файлов

Здравствуйте. Как перекодировать имена файлов и каталогов вида #U0440#U0438#U0441#U0443#U043d#U043e#U043a-1.png и подобного? Их очень много и это по ходу когда-то было в UTF-8 и теперь с ними что-то случилось. Прошу помощи. Пробовал convmv, но это кажется не то что нужно.

Решается простеньким скриптом. Можно на баше, можно на чём-нибудь ещё.

Скрипт напишу, но приведете пример команды как конвертировать хотя бы один файл?

Скрипт напишу, но приведете пример команды как конвертировать хотя бы один файл?

$ echo -e $(echo '#U0440#U0438#U0441#U0443#U043d#U043e#U043a-1.png' | tr '#' '\\') рисунок-1.png 

Но учти, что этот код небезопасен. Например, если в каком-то имени окажутся закодированные юникодом ../../../../../etc/passwd то после запуска такого скрипта от рута файл /etc/passwd будет перезаписан, так что в реальном скрипте нужно ввести дополнительные проверки. Ну и ещё нет гарантий, что подобная команда корректно отработает для всех имён.

Считай что это просто proof of concept

Xenius ★★★★★ ( 25.04.16 16:19:44 MSK )
Последнее исправление: Xenius 25.04.16 16:23:02 MSK (всего исправлений: 2)

Кроме того, заменятся не только #Uxxxx но и другие последовательности, что может быть нежелательным.

Но тут нужно проанализировать всё дерево, встречаются ли там другие спецсимволы. Есть ли там # в другом контексте и тд.

Xenius ★★★★★ ( 25.04.16 16:34:10 MSK )
Последнее исправление: Xenius 25.04.16 16:35:10 MSK (всего исправлений: 1)

что было, сказать теперь вряд ли возможно, но то, что есть — это UCS2 или UTF-16, причем первые 2 цифры — 04 — старший байт.

Спасибо большое! Попробовал вот такой скрипт:

for file in `find ./ -type f -name "*"` do MSG=$(echo -e $(echo $ | tr '#' '\\')) echo $ done

и там где есть пробелы, выдаёт не одной строкой:

./images/ABB/Выключатели нагрузки в боксах/PaxHeader/2CMC300007F0026_720.jpg ./images/ABB/Выключатели нагрузки в боксах/PaxHeader/2CMC300007F0025_720.jpg ./images/ABB/Выключатели нагрузки в боксах/PaxHeader/S00507A_195.jpg ./images/ABB/Выключатели нагрузки в боксах/PaxHeader/OTC_kansi_FL_720.jpg

Как это можно сделать чтобы одной строкой выводило а не переносило на следующую?

Источник

Оцените статью
Adblock
detector