Серверная (www.it-simple.ru)

Управляющие символы в именах файлов


В Linux возможно создавать файлы с табуляциями, переносами строк и другими управляющими символами в имени.

Вот пример команды, которая создаёт такой дикий файл:

touch $'Иванов\t\t100руб.\nПетров\t\t200руб.\nСидоров\t\t150руб.'

Здесь надо обратить внимание на конструкцию $'строка'. Именно она позволяет внедрить в имя символы, которые для имён вообще не предназначены.

Выражения вида $'строка' обрабатываются особым образом. Выражение заменяется строкой, в которой предваренные обратным слешем символы заменяются в соответствии со стандартом ANSI C. Управляющие последовательности, начинающиеся с обратного слеша, декодируются следующим образом:

a	сигнал (звонок)
b	забой
e	управляющий символ
f	прогон страницы
n	перевод строки
r	возврат каретки
t	горизонтальная табуляция
v	вертикальная табуляция
\	обратный слеш
'	апостроф
\nnn	символ с кодом ASCII nnn в восьмеричном виде (от одной до трех цифр)
xnnn	символ с кодом ASCII nnn в шестнадцатеричном виде (от одной до трех цифр)

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

Строка в двойных кавычках, перед которой идет символ доллара ($), будет преобразована в соответствии с текущей категорией локализации (locale). Если текущая категория локализации - C или POSIX, символ доллара игнорируется. Если строка преобразована и заменена, результат помещается в двойные кавычки.

Без него все управляющие символы просто вырезаются.

Созданный таким образом файл будет корректно отображаться во многих графических программах, например в наутилусе:

Или в табах текстового редактора gedit.

Для доступа же к такому файлу из консоли (для удаления, редактирования или просмотра содержимого) нужно ввести его полное имя, используя структуру с символом «$», как при создании. Автодополнение по кнопке Tab будет работать не во всех случаях. Например, оно корректно обработает переносы строк, но не сможет справиться с табуляцией.

В который раз убеждаюсь, что у этой ОС практически нет ограничений.

Единственные символы, которые нельзя использовать в именах файлов в Linux — это значок «/» (дробь, слэш), разделяющий каталоги, и код \0, задающий конец имени файла.