Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Работа в консоли Linux

В Linux возможно все, даже многострочные имена файлов

Алексей Дмитриев, 23 мая 2009

Как приятно получать отклики от читателей! Особенно, если эти отклики способны дополнить содержание твоих статей.

В статье "HuMan: grep" , я, в частности, писал:

Опция -Z --null

Если в выводе программы содержатся имена файлов (например при опции -l), то опция -Z после каждого имени файла выводит нулевой байт вместо символа новой строки (как обычно происходит). Это делает вывод однозначным, даже если имена файлов содержат символы новой строки. Эта опция может быть использована совместно с такими командами как: find -print0, perl -0, sort -z, xargs -0 для обработки файловых имен, составленных необычно, даже содержащих символы новой строки. (Хотел бы я знать, как можно включить символ новой строки в имя файла. Если кто знает, не поленитесь - сообщите мне.)

И не поленились, сообщили!

Как можно создать имя файла, содержащее символ новой строки (\n)?

Вероятно есть несколько способов. Об одном из них мне любезно сообщил мой читатель Антон.

Вот этот способ:

$ echo В имени этого файла есть символ новой строки. > $'двухэтажный\nфайл'

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

$ ls

Desktop  Documents  lsmod.txt  Pictures  tmp  wine_c  двухэтажный?файл

Команда ls "недоумевает". Попробуем команду cat:

$ cat 'двухэтажный\nфайл'

cat: двухэтажный\nфайл: Нет такого файла или каталога

В лоб не вышло, применим автозавершение:

$ cat дву (TAB)

Получаем:

$ cat 'двухэтажный
файл' 

В имени этого файла есть символ новой строки.

Ага, заработало. Имя файла перешло на новую строку.

Но больше всех порадовал Konqueror - в файловом менеджере можно прекрасно видеть "двухэтажность" этого файла:

При помощи команды rm, и снова применив автозавершение, можно не только убедиться в переходе имени файла на новую строку, но также увидеть сам символ переноса строки:

$ rm -i 'двухэтажный
файл'
rm: удалить обычный файл `двухэтажный\nфайл'?  

Осталось прояснить, что же это за волшебный знак доллара ($), позволяющий создавать многоэтажные имена файлов? Тот же Антон любезно привел выдержку из man bash:

Слова вида $'строка' обрабатываются особым образом. Слово заменяется строкой, в которой предваренные обратной косой символы заменяются в соответствии со стандартом ANSI C.

В переводе на человеческий язык это означает, что управляющие символы языка Си (о них шла речь в статье "HuMan: tr"), предваряемые обратным слэшем (\), интерпретируются оболочкой bash именно как управляющие символы, если перед ними поставить знак доллара ($).


Объявляю конкурс на лучшее применение многострочных имен файлов. Присылайте предложения по почте (мой адрес под заголовком статьи), либо примите участие в обсуждение этой заметки на rus-linux.net.

26 ноября 2013 года Денис Антонов прислал такое замечание к этому материалу:

Здравствуйте. Увидел вашу статью 2009-го года про имена файлов, в которых содержится символ переноса строки.

В голову пришел еще один способ создать такое имя файла:
vi 'big
file'

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

А на вашу статью я попал вот по какому вопросу. Ничто не мешает создать файл с именем -1 (например, так: " echo text > -3 "). Но как работать с таким файлом? vi -3 и rm -3 обрабатываются некорректно.