Говорят, что в Unix и Linux в целом вы должны избегать пробелов в имени файла (обычный файл, dir, ссылка, файл устройства, ...).
Но я делаю это все время. Для имени файла с пробелом внутри
- В Nautilus символ пробела отображается как пробел.
- В терминале Bash я либо использую
\
для представления пробела, либо заключаю имя файла в пару двойных кавычек. - в файлах некоторых приложений (Наутилус, не уверен, будет ли это делать и ОС), имя файла записывается с заменой пробела на
%20
.
Действительно ли пробел в имени файла не разрешен?
Как правильно использовать пробел в имени файла?
-rf ~
(использоватьtouch -- "-rf ~"
), но я бы не рекомендовал это делать./
разделитель). Использование всех 254 оставшихся байтов открывает дверь ко всем способам неописуемых «имен». Очевидно, это безумие, но не все согласны с тем, что такое «вменяемый», и разные персонажи сломают разные инструменты. Пересечение здравомыслия каждого довольно мало .Ответы:
Пробелы, и действительно каждый символ, кроме
/
и NUL, разрешены в именах файлов. Рекомендация не использовать пробелы в именах файлов исходит из опасности того, что они могут быть неправильно истолкованы программным обеспечением, которое их плохо поддерживает. Возможно, такое программное обеспечение глючит. Но также возможно, что языки программирования, такие как сценарии оболочки, делают слишком легким написание программного обеспечения, которое ломается при представлении имен файлов с пробелами в них, и эти ошибки имеют тенденцию проскальзывать, потому что сценарии оболочки не часто тестируются их разработчиками, использующими имена файлов с пробелами в их.Замены пробелов
%20
не часто встречаются в именах файлов. Это в основном используется для (веб) URL. Хотя это правда, что% -кодирование из URL иногда попадает в имена файлов, часто случайно.источник
bash
. Я попробовал несколько вещей, таких как цитирование с помощью Ctrl-V и что-то вроде этого,$(echo -e \\0)
но это не сработало. Дело в том, что NUL не может использоваться в именах файлов, потому что он не может использоваться в строках C (потому что это терминатор строк), и все базовые API, а также практически все строки, обрабатываемые программами C, используют этот формат , Посколькуbash
он написан на C, он может вообще не иметь поддержки для любых строк с NUL в них. Я могу ошибаться, может быть какой-то непонятный путь ...NUL
и bash, вам нужно$'\0'
. Например:find . -print0 | while read -d $'\0' f; do echo "$f"; done
Пространства будут разрешены в именах файлов, как вы заметили.
Если вы посмотрите на запись «большинство файловых систем UNIX» в этой таблице в википедии , вы заметите:
Разрешен любой 8-битный набор символов. Под этим зонтиком мы также можем включить 7-битный ASCII, поскольку он является подмножеством различных 8-битных наборов и всегда реализуется с использованием 8-битных байтов.
Единственными запрещенными символами являются
/
и «ноль». «Нуль» относится к нулевому байту, но они все равно не разрешены в текстовых данных.Однако , если вы используете какую-либо оболочку, вы, возможно, поймете, что есть некоторые символы, которые, в первую очередь
*
, создадут неприятности, а именно оператор глобализации POSIX.В зависимости от того, как вы хотите определить «хлопот», вы можете включить туда пробелы (пробелы, табуляции, новые строки и т. Д.), Так как это создает необходимость в кавычках
""
. Но это неизбежно, так как пробелы разрешены, так что ...В контексте оболочки / командной строки, оберните имя файла в одинарные или двойные кавычки (но обратите внимание, что они не совпадают с другими проблемами WRT) или экранируйте пробелы
\
, например:источник
touch $(echo -e "foo\00bar")
- это-e
процесс\0N
как восьмеричное значение, но он все равно где-то теряется, так как он просто создает файл с именемfoobar
. Конечно, NULL не может быть напечатан, но я гарантирую, что он пропал оттуда из-за ограничения строки C.foo[NULL]bar
в конечном итоге, какfoo
для большинства намерений и целей. Тот факт, что этого не происходит,echo -e
показывает, что NULL где-то был удален./
который является разделителем каталогов и не может быть заключен в кавычки, поэтому может быть в пути но не в имени файла).Причина в значительной степени историческая - WAY назад в тумане пространств времени не было разрешено в именах файлов, поэтому пробелы использовались в качестве разделителей ключевых слов / имен файлов. Будущие интерпретаторы оболочки должны были быть обратно совместимы со старыми сценариями, и поэтому мы застряли на головной боли, которую мы испытываем сегодня.
Разработчики процессов, которым не нужно иметь дело с людьми, могут многое сделать намного проще, просто отбросив пробелы. Apple делает это, содержимое / System / Library / CoreServices / содержит очень мало пробелов, программы с пробелами открываются от имени пользователя иWouldLookStrangeIfCamelCased. Подобные пути только для Unix также избегают пробелов.
(отчасти связанный анекдот: в середине 90-х беспилотник Windows сказал «Назовите одну вещь, которую вы можете сделать на Mac, которую я не могу сделать в Windows» -> «Использовать 12 символов в имени файла». -> Тишина. Пробелы были также возможно в этих 12 символов)
источник
Так что да, как уже много раз говорилось в другом месте, имя файла может содержать практически любой символ. Но нужно сказать , что имя файла является не файл. Он имеет некоторый вес в качестве атрибута файла, поскольку для открытия файла обычно требуется имя файла, но имя файла указывает только на фактический файл. Это ссылка, которая хранится в каталоге, в котором она была записана, вместе с номером инода, что намного ближе к реальному файлу .
Итак, вы знаете, называйте это как хотите. Ядру все равно - все ссылки на файлы, которые оно будет обрабатывать, будут иметь дело с реальными номерами инодов. Имя файла предназначено для потребления человеком - если вы хотите сделать его сумасшедшим, это ваша файловая система. Здесь я сделаю некоторые сумасшедшие вещи:
Сначала я создам 20 файлов и назову их только пробелами, каждое имя файла будет на один пробел больше, чем последнее:
Это довольно забавно. Посмотри на мои
ls
:Теперь я собираюсь отразить этот каталог:
Вот
../mirror/
содержание:Хорошо, но, может быть, вы спрашиваете - но что в этом хорошего? Как вы можете сказать, что есть что? Как вы можете быть уверены, что связали правильный номер инода с правильным именем файла?
Что ж...
ВЫХОД
Смотрите, и номер индекса, содержащийся в нем,
../mirror/"${tgt%% .*}"
и номер ссылки, на который ссылается ссылка,./' '
относятся к одному и тому же файлу Они описывают один и тот же файл. Они называют это, но не более того. На самом деле в этом нет ничего загадочного, только некоторые неудобства, которые вы могли бы причинить себе, но в конечном итоге это практически не повлияет на работу вашей файловой системы unix.источник