В bash
, попробуйте следующий код:
#!/bin/bash
c=0
for f; do
if ! ((c % 100)); then
folder=folder_$(printf "%03d\n" $c)
mkdir -p $folder
fi
[[ -d "$f" ]] || mv "$f" "$folder"
((c++))
done
Запустите скрипт как этот:
./script.bash *
Самая старая кодировка символов, используемая в таких консолях, как VT52 , была ASCII .
Это основное решение было принято в течение многих лет. Большинство консолей используют ASCII в качестве основного набора символов, определенного ANSI. Следующим набором кодировок (на западе )являются наборы ISO -8859 (от 1 до 15 ). По одному для каждого языка (языковой группы ). Наиболее распространенным является ISO -8859 -1 (английский ), а другой пропорционально соответствующему используемому языку.
Затем наиболее общий список мировых символов — это Unicode, который в Linux обычно кодируется в UTF -8.
Это самая распространенная кодировка для современных терминалов и программ в Linux.
От более общих настроек к частным:
По умолчанию в debian, начиная с Etch наApr 8th 2007
(13 лет назад ), используется utf -8.
Note : Fresh Debian/Etch installation have UTF8 enabled by default.
И подтверждено в примечаниях к выпуску :
.The default encoding for new Debian GNU/Linux installations is UTF-8. A number of applications will also be set up to use UTF-8 by default.
Это означает, что Debian (и Ubuntu, Mint и многие другие )поддерживают utf -8 по умолчанию.
Какая кодировка (и страна )фактически выбирается пользователем с помощью команды dpkg-reconfigure locales
, остается на усмотрение пользователя.
Служит для настройки конкретных параметров команды компьютера locale
.
Все LC_*
«переменные среды» оказывают определенное влияние на каждый из разделов страны/языка (частей ), как определено спецификацией POSIX .
Но это всего лишь «общие» настройки. Конкретный терминал может (или не может )соответствовать ему. Ну и вообще обычная кодировка для большинства терминалов сегодня utf8.
Кодировка для конкретного терминала (tty )может быть найдена, если установлено значение utf8 с:
$ stty -a | grep -o '.iutf8'
iutf8
То есть нет -
перед выводом результата.
Ноterminal
(окно графического интерфейса ), внутри которого (обычно )работает tty-терминал, также имеет собственную настройку локали. Если настройки вменяемые , возможно:
$ locale charmap
UTF-8
Будет правильный ответ.
Но это всего лишь беглый и очень поверхностный взгляд на все настройки i18n в linux/unix.
Заберите :Вероятно, если Linux использует utf8, это будет лучшим выбором.
Я использовал бы подобную эвристику, которую Вы используете с пользователями Windows, но через переменную окружения ЛЕНГА. Например, в моей системе:
$ echo $LANG
en_US.UTF-8
Здесь, в коде говорится, что я использую английский язык, но с кодировкой UTF-8 имен файлов и файлов.
Как правило у пользователей Linux, использующих UTF-8, будет "UTF-8" в конце их переменной окружения ЛЕНГА.
Современные установки Linux (в течение по крайней мере приблизительно 5 лет, вероятно, дольше) используют UTF-8. Как это обрабатывается путем устанавливания значений среды LC_CTYPE
, LANG
, и LANGUAGE
. Посмотрите, например, обсуждения здесь или здесь (центрируемый Unicode).
Для довольно современных систем Linux/Unix Вы не должны должны быть волноваться о терминальном кодировании. Просто используйте getwchar
или fgetws
читать из stdin
(или терминал). [Примечание 1]
Как man getwchar
говорит, в Notes
раздел:
Разумно ожидать, что getwchar () на самом деле считает многобайтовую последовательность из стандартного входа и затем преобразует его в широкий символ.
Существует подобное примечание в man fgetws
.
С Linux также разумно ожидать кодирование wchar_t
быть unicode, независимо от локали. C99
стандарт позволяет реализации определять макрос __STDC_ISO_10646__
указать на это wchar_t
значения соответствуют кодовым точкам Unicode [Примечание 2], таким образом, можно вставить проверку времени компиляции на это ожидание, которое должно успешно выполниться на современных установках Linux со стандартными наборами инструментальных средств. Это, вероятно, успешно выполнится в современных системах Unix также, хотя нет никакой гарантии.
Примечания:
[1] Действительно необходимо инициализировать локаль путем вызова setlocale(LC_ALL, "");
однажды в начале выполнения программы. Посмотрите man setlocale
.
[2] Значение __STDC_ISO_10646__
дата (в формате yyyymmL
) соответствие дате соответствующей версии стандарта Unicode. Точная формулировка из стандарта (проект):
Следующие макро-имена условно определяются реализацией:
__STDC_ISO_10646__
Целочисленная константа формыyyyymmL
(например,199712L
). Если этот символ определяется, то каждый символ в Unicode потребовал набора при хранении в объекте типаwchar_t
, имеет то же значение как короткий идентификатор того символа. Unicode потребовал, чтобы набор состоял из всех символов, которые определяются ISO/IEC 10646, наряду со всеми поправками и техническими исправлениями, по состоянию на указанный год и месяц. Если некоторое другое кодирование будет использоваться, то макрос не должен быть определен, и фактическое используемое кодирование определяется реализацией.