Які символи безпечні у міжплатформних іменах файлів для Linux, Windows та OS-X


60

В даний час я використовую YYMMDD-NAME+PAGEім'я для більшості своїх файлів. NAMEмає пробіли, перетворені на підкреслення.

Я хотів би використовувати YYYY-MM-DDформат дати, але я не впевнений, як відокремити його від імені. A -виглядало б дивно, якби назва починалася з числа. Якщо я використовую a _, то це суперечить підкреслювальному знаку, що представляє пробіл.

Які символи досить безпечні у назвах файлів, які працювали б тут? Я в Linux, але я можу ділитися файлами з іншими людьми (Windows 7, Mac OS X).


… На Unix, Windows, Amiga 1000?
slhck

Переважно сучасний Linux.
Мартін Удінг

- символ безпечний для використання в Windows 7 .. може бути і інша сучасна операційна система, зробіть те саме .. ви можете використовувати мінус символ для розділення ..
Niranjan Singh

Відповіді:


48

Підсумок:

  • Windows: будь-що, крім контрольних символів ASCII та \/:*?"<>|
  • Linux, OS-X: усе, крім нульового або /

На всіх платформах найкраще уникати недрукувальних символів, таких як контрольні символи ASCII.

Windows

У Windows Windows Explorer не дозволяє контролювати символи або \/:*?"<>|Ви можете використовувати пробіли. Якщо ви використовуєте пробіли, вам часто доведеться цитувати ім'я файлу, коли воно використовується в командному рядку (але програми GUI, наскільки я знаю, не впливають). Файлова система Windows, наприклад NTFS, очевидно, зберігає кодування з ім'ям файлу, але UTF-16 є стандартним.

Деякі частини Windows залежать від регістру, інші - нечутливі до регістру. У файловій системі Windows NTFS легко створити різні імена файлів, такі як "Ab" та "ab". Ці імена відносяться до окремих файлів, що містять окремий окремий вміст. Однак, хоча командний рядок Windows із задоволенням перераховує обидва файли за допомогою dir, ви не можете легко отримати доступ до одного з них та керувати ним, використовуючи такі команди, як type. Дивіться нижче.

Linux, OS-X

/Я вважаю, що в Linux і OS-X заборонений лише набір для друку ASCII. Деякі символи (такі як метахарактори оболонки *?!) спричинять проблеми в командних рядках і вимагатимуть відповідного цитування або скасування імені файлу.

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

Висновок

Тож ви, ймовірно, могли спокійно використовувати щось на кшталт (якби це було не так складно)


Чутливість кейсів (в) у Windows

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

Зауважте, що ми не можемо набрати вміст другого файлу, команда Windows typeпросто повертає вміст Ab. Третій файл також відрізнятиметься від AB на Linux.

(Windows 10 NTFS).


1
Загалом, відповідь хороша, але я б утримався від використання назви файлів у пробілах. Уникнути їх належним чином у всіх контекстах - це більше клопоту, ніж варто. Зауважте, що Microsoft перестала використовувати простір у назвах системних директорій. Якщо вам потрібно вказати межі слів у назвах, CamelCase працює чудово.
Ісаак Рабінович

4
"C: \ Програмні файли (x86)" все ще існують у Win8 - це не системний каталог? Я згоден, що пробіли можуть спричинити проблеми.
RedGrittyBrick

Так є, але його можна перейменовувати майже на що завгодно. Звичайно, багато програм буде відросло, якщо ви перейменовуєте його на "]: \ foobar", але Windows у будь-якому випадку називає це "% programfiles (x86)%".
Маркс Томас

2
Щось справді слід пам’ятати, система Linux може розглянути великі та малі регістри як окремі, тоді як Windows вважає їх однаковими.
thecoshman

1
Ви здивуєтеся, скільки програм засмоктують при розборі. Ось чому не було Windows 9.
Ісаак Рабінович

46

Хоча відповідь RedGrittyBrick технічно правильна, безпека - не єдине питання: зручність також важлива. Я вважаю, що краще питання "які символи добре використовувати в імені файлу".

Деякі потенційні вказівки:

  • [0-9a-zA-Z_] - Буквено-цифрові символи та підкреслення завжди добре використовувати.
  • \/:*?"<>|і нульовий байт проблематичний принаймні в одній системі, і його завжди слід уникати.
  • Простіри використовуються як роздільники аргументів у багатьох системах, тому імена файлів з пробілами слід уникати, коли це можливо. Інші пробіли (наприклад, вкладки) тим більше.
  • Точки з комою (;) використовуються для розділення команд у багатьох системах. Точки з комою та комами (,) використовуються для розділення аргументів командного рядка на (деяких версіях?) Командного рядка Windows.
  • []()^ #%&!@:+={}'~і [`] всі мають особливі значення у багатьох оболонках, і вони дратують обійтися, і цього слід уникати. Вони також мають тенденцію виглядати жахливо в URL-адресах .
  • Провідні персонажі, яких слід уникати:
    • Багато програм командного рядка використовують дефіс [-] для позначення спеціальних аргументів.
    • * Системи на основі nix використовують повну зупинку [.] як провідний символ для прихованих файлів і каталогів.
  • Все, що не міститься в наборі ASCII, може спричинити проблеми зі старими або більш базовими системами (наприклад, деякими вбудованими системами), і їх слід використовувати обережно.

Це в основному залишає вас з:

[0-9a-zA-Z -._]

які завжди безпечні та не дратівливі у використанні (доки ви запускаєте ім'я файлу з буквено-цифрового числа) :)


1
Дужки ( []) є частиною регулярних виразів і мають особливе значення і в оболонці. Але з ними не так вже й погано працювати, за винятком деяких злих кутових випадків.
Мартін Удінг

1
Хрм ... Я думаю, те саме можна сказати ()і насправді.
naught101

4
У zsh символи, які можуть бути інтерпретовані по-різному []()^;, тому я думаю, що правильна відповідь насправді може бути [0-9a-zA-Z.,_-]Комою, можливо, також може бути виключена лише тому, що це дивно бачити у імені файлу, хоча я не можу придумати справжній випадок, коли це спричинить проблеми.
Кейсі Родармор

так, я видалив їх із остаточного списку
naught101,

1
кома може дратувати, спробуйте echo whereami > a,b,cу вікні командного рядка Win10.
RedGrittyBrick

4

Ти міг:

  1. замінити поточні підкреслення на #(символ коректора для пробілу)
  2. Підкреслення до дати "розділу" від імені файлу (або другого дефісу - простіше набрати)

Alt-1. Initial-caps може замінити пробіли: YYMMDD-HHMM-FileName.extабоYYMMDD-HHMM_FileName.ext

Мінімальні символи для чіткого відображення, які автоматично сортують із підбитими нулями для січня-вересня (та 1-го-9-го вечора).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.