Правильно ли использовать определенные специальные символы при именовании имен файлов в Linux?

18

Является ли это исправить , чтобы использовать некоторые специальные символы, а +, &, ', .(точка) и ,(запятая), в основном, в именах файлов.

Я понимаю, что вы можете использовать -и _без проблем, но проводя некоторые исследования, я не смог найти что-то определенное в отношении других символов; некоторые говорят, что вы можете, некоторые говорят, что вы не можете, а другие говорят, что их «не поощряют» (что бы это ни значило).

Крис Кляйн
источник
Какие программы вы используете для работы с этими файлами. Только программы, которые интерпретируют некоторые символы особым образом (например, оболочки в строках без кавычек), будут создавать проблемы. Ваша средняя программа на C принимает все, что не NUL, не моргая глазом.
Антон
9
Что вы подразумеваете под «правильным»?
Дэвид Ричерби
Проблема с использованием специальных символов в имени файла заключается в том, что это увеличивает вероятность того, что какой-то ошибочный фрагмент кода будет неправильно обрабатывать имя файла. Тем не менее, я не думаю, что какой-либо из перечисленных вами персонажей может вызвать какие-либо проблемы. У вас будет больше проблем с пробелами, которых, как правило, следует избегать . И EOL, в частности, следует избегать любой ценой.
У Windows есть более строгие ограничения на то, что может быть в имени файла, поэтому, если есть вероятность, что файлы нужно будет использовать там, на это стоит обратить внимание.
evilsoup

Ответы:

28

Правильно ли использовать определенные специальные символы, такие как +, &, ',. (точка) и, (запятая), в основном, в именах файлов.

Да.

Правильно, но не обязательно желательно или удобно.

В современных файловых системах Unix и Linux вы можете использовать любые символы, кроме null и/ внутри имени файла.

Вы можете использовать пунктуацию ASCII . Некоторые утилиты используют точки ( точки ) и запятые в именах файлов, которые они создают.

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

Вы можете использовать метасимволы оболочки, такие как амперсанд ASCII и апостроф ASCII. Однако это неудобно и требует, чтобы при построении команд вы проявляли особую осторожность, чтобы заключать в кавычки или экранировать такие символы.

Вы можете использовать многобайтовые символы, используя различные кодировки. Это зависит от оболочки и / или утилит, чтобы правильно интерпретировать и отображать не-ASCII символы. Желательно ограничиться популярной кодировкой, такой как UTF-8, и установить соответствующий языковой стандарт.

У вас будет меньше проблем с использованием печатаемых символов ASCII, ограничивая набор знаков пунктуации теми, которые не являются метасимволами оболочки, и не начинайте имя с дефиса (или остановки - если вы не хотите скрыть файл).

RedGrittyBrick
источник
23

Как утверждают другие, в современных системах Unix / Linux имена файлов могут содержать любые символы, кроме \0(NUL) и /(косая черта).

Кроме того, стандарт POSIX определяет переносимый набор символов для имен файлов:

3.278 Портативный набор символов имени файла

Набор символов, из которых составляются переносимые имена файлов.

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -

Последние три символа - это символы <period>, <underscore> и <hyphen> соответственно. Смотрите также Путь .

pathchkУтилита от GNU Coreutils проверки для этого при вызове с -pпараметром, и -Pопция будет предупреждать о пустых имен файлов (которые не являются действительными , но могут быть переданы в качестве аргумента pathchk) и имена файлов , начинающиеся с дефиса ( -).

nyuszika7h
источник
9

Самая безопасная ставка - обратиться к записи в Википедии о разрешенном наборе символов для любой операционной системы. Это можно найти здесь .

Например, для большинства систем, основанных на Unix, допустимым набором символов является 8-битный набор, а зарезервированным символом является нулевой символ (NUL, '\0'). Однако не рекомендуется использовать специальные символы в именах файлов, так как они создают проблемы при их удалении.

Например, я могу иметь имя файла как -ramesh.txtи я пытаюсь удалить его, как показано ниже.

rm -ramesh.txt
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.
rm "-ramesh.txt"
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.

Мне нужно удалить файл как,

rm -- "-ramesh.txt"
rm: remove regular empty file `-ramesh.txt'? y

Более подробную информацию можно найти в этом ответе .

В Linux и OS-X /запрещено только печатный набор ASCII. Некоторые символы (например, метасимволы оболочки *?!) вызовут проблемы в командной строке и потребуют, чтобы имя файла было соответствующим образом заключено в кавычки или экранировано.

Файловые системы Linux, такие как ext2, ext3, не зависят от набора символов (я думаю, они просто более или менее воспринимают его как поток байтов - только нули и /запрещены). Это означает, что вы можете хранить имена файлов в кодировке UTF-8. Я полагаю, что это зависит от оболочки или другого приложения, чтобы знать, какую кодировку использовать для правильного преобразования имени файла для отображения или обработки.

Итак, в заключение, проблема заключается не в использовании специальных символов для имен файлов, а в том, как их обрабатывать.

Рамеш
источник
По этой причине («как с ними обращаться») я почти исключительно использую только буквы, цифры, подчеркивания и точки, хотя бы для того, чтобы облегчить свою жизнь, когда позже я решу, что мне нужно использовать программы командной строки, чтобы что-то делать с моими файлами (который, кажется, всегда подходит по крайней мере один раз).
phyrfox,
19
Не защищать имена файлов, начинающиеся с, -а просто чтобы быть точными: 1) вам определенно не нужны кавычки вокруг этого имени файла, 2) вместо использования специального --аргумента вы можете делать именно то, что rmпредлагает сам: rm ./-ramesh.txtтак что вам не нужно это делать именно так, как вы предлагаете.
Михал Политовски,
@ MichałPolitowski Мало того, что вам не нужны кавычки, они имеют абсолютно нулевой эффект.
Ctrl-Alt-Delor
4

Ваше исследование почти верно. В именах файлов можно использовать специальные символы, но это не рекомендуется, поскольку эти символы имеют особое значение. Соглашения об именовании файлов в Linux описывают и другие ограничения на имена файлов, такие как «Имена файлов никогда не должны начинаться с дефиса».

Простой пример выполнения операций командной строки со специальными символами в именах файлов.

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

Просто я
источник
1
Таким образом, ваш совет будет использовать только -, _и .(точка) в именах файлов?
Крис Кляйн
@ChrisKlein, да, но не в начале имени файла.
Simply_Me
Особое значение в программе (например, в вашей оболочке), а не в имени файла. Почти все программы на U & L не заботиться о характерах на всех тех пор, пока не NUL в имени файла.
Антон
@ Антон, да, моя оболочка, как описано в ссылке.
Simply_Me
2
В качестве личной заметки я бы порекомендовал разработчикам назвать родительскую папку своего проекта чем-то вроде «föλder \ t -» - чтобы они сразу заметили, если сделают ошибку, которая ломается в таких именах файлов, вместо публикации испорченного кода или двоичных файлов что другие должны обойти. Его использование не является проблемой, если только оно начинается с 'f', в любой оболочке будет добавлено табуляция, что затруднит ввод текста.
Петерис