Угода про іменування файлів Unix [закрито]


61

Мені було цікаво, що таке умовний режим імен для файлів в Unix? Я не впевнений у цьому, але я думаю, існує, можливо, універсальна конвенція про іменування, якої слід дотримуватися?

Наприклад, я хочу назвати файл сказати: backupз part 2іrandom

Чи повинен я це зробити так:

backup_part2_random

АБО

backup-part2-random

АБО

backup.part2.random

Сподіваюся, питання зрозуміле. В основному, я хочу вибрати формат, який відповідає філософії Unix.


4
Як загальний коментар щодо "конвенцій" ... Я щойно прочитав усі відповіді до цього часу, і мене вразило, як це не дивно, що існує майже неприйнятність використання лише одного випадку в системі, де (я думаю) однією з його сильних сторін є можливість змістовно використовувати обидва випадки ... Був оригінальний дизайн (
залежно від

моя думка: Конвенції немає. назви файлів - це лише рядки. підберіть свій улюблений стиль.
glenn jackman

1
Це тому, що ніхто не хоче пам’ятати про використання великих літер команд, тому всі вони використовують одне і те ж.
LtWorf

Відповіді:


57

.використовується для відокремлення розширення типу файлів, наприклад foo.txt.

-або _використовується для розділення логічних слів, наприклад, my-big-file.txtіноді my_big_file.txt. -краще, тому що вам не потрібно натискати клавішу Shift (принаймні зі стандартною клавіатурою ПК з англійської мови США), інші віддають перевагу _тому, що це більше схоже на пробіл.

Тож, якщо я розумію ваш приклад, backup-part2-randomчи backup_part2_randomбув би найближчим до нормальної конвенції Unix.


CamelCase зазвичай не використовується в системах Linux / Unix. Подивіться назви файлів у /binта /usr/bin. CamelCase - це виняток, а не правило для систем Unix та Linux.

( NetworkManagerЄдиний приклад, про який я думаю, що використовує CamelCase, і його написав розробник Mac. Багато хто скаржився на такий вибір імені. На Ubuntu вони фактично перейменували сценарій у network-manager.)

Наприклад, /usr/binу моїй системі:

$ ls -d [A-Z]* | wc -w    # files starting with a capital
6
$ ls -d *_* | wc -w       # files containing an underscore
178
$ ls -d *-* | wc -w       # files containing a minus/dash
409

і навіть тоді жоден з файлів, починаючи з великої літери, не використовує CamelCase:

$ ls -d [A-Z]*
GET  HEAD  POST  X11  Xvnc  Xvnc4

Значок .також можна використовувати для обертання речей, а не лише для вказання розширення. Наприклад my.log my.log.1 my.log.2.gz.
Депадо

Тож дефіс / мінус / тире частіше, ніж підкреслення.
Гюго

@Hugo Так. Наведене вище показує мінус (409) проти підкреслення (178).
Мікель

Дякую. Чи є у вас посилання на ці конвенції?
Пролетаріат

3
+1 для посилань. (@ Пролетаріат, lsвихід з /usr/bin - посилання. Це питання про конвенції. )
Wildcard

35

Набагато важливіше, щоб певна конвенція була послідовною. Виберіть стиль та дотримуйтесь його.


19

Я приймаю за умовами назви файлів Unix / Linux:

  • Файлові системи Unix / Linux по суті не підтримують поняття розширення. Концепція розширення файлу повністю існує як - то підтримується утиліти , такі як cp, lsабо оболонки , яку ви використовуєте. Я вважаю, що це так і на NTFS, але я можу помилитися.

  • Виконавчі файли, включаючи сценарії оболонки, зазвичай ніколи не мають будь-якого типу розширення. У сценаріїв буде лінія хешбангу (тобто #!/bin/bash), яка визначає, яка програма повинна її інтерпретувати.

  • Будь-який виконуваний файл, який має дві літери, дуже важливий. Тому не називайте двома літерами файли своїх файлів. Будь-який файл , в який /etcзакінчується в tabтеж супер важливо, такі як fstab, mtab, inittab.
  • Іноді .dдодається до імен каталогів, особливо в /etc, але це не є поширеним (ОНОВЛЕННЯ: https://serverfault.com/questions/240181/what-does-the-suffix-d-mean-in-linux )
  • rcшироко використовується для сценаріїв або файлів конфігурації, або попередньо (наприклад, rc.local), або суфіксів ( .vimrc)
  • У спільноті Unix / Linux ніколи не було обмеженого на три символи розширення та нахмурень при скороченні добре розширених знань. Наприклад, не використовуйте .htmнаприкінці файлів HTML на Unix / Linux, використовуйте .html.
  • У наборі файлів ім'я файлу іноді пишеться з великої літери або з усіма великими літерами, тому воно з’являється на початку списку каталогів. Класичний приклад - Makefileу вихідних пакунках. Робіть це лише для подібних речей README.
  • ~використовується для ідентифікації файлу резервної копії або каталогу, як у important_stuff~, або /etc~. Багато снаряди розширяться самотніми ~в $HOME.
  • Файли бібліотеки майже завжди починаються з lib. Виняток - це, zlibймовірно, кілька інших.
  • Сценарії, які викликаються inetd, іноді позначаються провідними in., наприклад in.tftpd.
  • Закінчення z vmlinuzозначає поштовх, але я жодного разу не бачив жодного іншого файлу, названого таким чином.

2
Я часто бачу сценарії оболонки з .sh"розширенням" на них. Мені особисто це дещо дратує, але я мушу визнати, що, можливо, я не знаю про якісь вагомі причини для використання .sh.
Dan Molding

4
Здається, що корисно підкреслити той факт, що це текстовий сценарій, а не двійковий.
LawrenceC

1
@DanMoulding, я особисто використовую .shсценарії, які (1) не призначені для інтерактивного запуску, а лише з інших скриптів / програм, або (2) призначені для пошуку, а не виконання. Для перших вони повинні бути виконаними; для останнього я залишаю виконаний біт вимкненим і використовую рядок shebang лише для документації того, для чого оболонки написані функції.
Wildcard

3
@Wildcard я з тих пір (6 років тому) потрапив у цю саму звичку. Розширення насправді має багато сенсу для пошуку бітів сценарію. Наприклад, з виконуваного сценарію, написаного для zsh (тобто #!/bin/zshвгорі), ви знаєте, що можете безпечно джерело іншого файлу з розширенням .zsh і бути впевненим, що він містить законний zsh-код. Якщо ваш виконуваний сценарій суворо сумісний з Bourne Shell (тобто #!/bin/shвгорі), то ви знаєте, що пошук цього .zsh-файлу буде проблематичним.
Дан Ліплення

4
Я вважаю, що використання ".sh", ".py", ".pl" тощо є зручним, а деякі текстові редактори (наприклад, Geany) використовують їх, щоб зробити першу здогадку за правильною схемою виділення синтаксису.
bgvaughan

7

У Unix ім'я файлу - це лише рядок, на відміну від DOS, де ім'я файлу складалося з імені та розширення. Таким чином, будь-яка з заданих імен файлів цілком прийнятна.

Але багато програм все ще використовують суфікси файлів, починаючи з крапки, щоб розрізняти різні типи файлів, тобто веб-сервер Apache використовує суфікси для встановлення правильного типу MIME у заголовках відповідей.


5
Хоча gelraen є на 100% правильним: Unix / Linux як такий не піклується про розширення файлів, сучасні смаки Linux дбають про те, що деякі розширення оболонки забезпечують спеціальну ідентифікацію (кольори чи іншим чином) певних типів файлів, а менеджери файлів забезпечують автоматичні асоціації з програмами. Але так само важливо, щоб користувач людини знав, який файл - який тип. З цією метою зручно дотримуватися стандартної схеми, не тільки узгодженої для себе, але і для інших. У цьому відношенні речі не повинні надмірно відрізнятися, ніж MS Windows (або MIME).
asoundmove

Інакше сказане, що декілька різних стилів розширення можуть відповідати одній цілі. Таким чином .tar.gz еквівалентний .tgz, .tar.bz2 = .tbz, .ps.gz часто скорочується як .ps (заплутано), і я впевнений, що їх набагато більше.
asoundmove

@asoundmove .ps.gz означає, що це стислий .ps-файл. Так само, як .tar.gz означає стислий файл .tar.
jonescb

1
@jonescb, так, звичайно. Моя думка щодо заплутаності полягає в тому, що, коли я бачу .ps, я очікую, що не стиснений файл (який я повинен мати змогу переглядати або менше), але часто .ps файли стискаються і насправді повинні бути .ps.gz для наочності ( оскільки для перегляду вихідного коду їм потрібен zcat або zless). Деякі люди вирішили все-таки просто суфіксувати стислі файли PostScript з .ps, оскільки деякі звичайні глядачі PS насправді не проти того, стиснуті вони чи ні.
asoundmove

6

Дві думки:

  1. У Naming Variables, Functions, and Filesрозділі Стандартів кодування GNU ви знайдете:

    Будь ласка, використовуйте підкреслення для розділення слів в імені, щоб команди Emacs могли бути корисними в них. Дотримуйтесь нижнього регістру;

    Хоча IMO каже, що "Ви повинні використовувати, _тому що emacs" здається трохи застарілим, це все ж є в їх "стандартах" документа.

  2. Припустимо, на мить, що ми всі погоджуємося, що ядро ​​Linux - це все-і-і-все-все * для Linux-проектів, і що там використовувані конвенції - це те, що можна вважати «стандартною» умовою.

    grep-ing джерело для ядра Linux ви знайдете наступне:

    • 44,6% часу використовується лише тире
    • 54,1% часу лише підкреслюють
    • 1,2% часу, коли файл використовує обидва.

Цікаво, що джерело для git становить 85% для тире, 3,8% для підкреслення та 11,1% для обох.

Вибір зрозумілий, дискусія закінчена. ;)

Особиста думка: я використовую тире з естетичних та зрушень ключових причин. Якщо ви працюєте над командою, голосуйте. Але щоб повторити сказане, будьте послідовними .

* або "be_all та end_all", якщо вам подобається


4

Символи, які ви не повинні використовувати у назви файлів:

| ; ,! @ # $ () <> / \ "'` ~ {} [] = + & ^

Розмежувачі символів, які слід використовувати для полегшення читання імен:

_ -. :

(У деяких випадках ":" має особливе значення, хоча)


5
Звичайно, ви навіть не можете використовувати "/" у назви файлів. Все інше можливо. І якщо ви хочете зробити це важким для доступу, навіть корисним ;-)
Юрген А. Ерхард

Список насправді набагато довший, включаючи контрольні та не ASCII символи. Так, ви можете мати задню область як частину імені * nix.
l0b0

1
Більш того, більшість * nix систем забороняють лише два конкретні символи в іменах файлів: /роздільник шляху та строковий термінатор \ 0 (ASCII нуль).
CVn

4

Щоб додати те, що сказали інші, я просто зазначу, що хоча букви з наголосом та багато спеціальних символів є легальними в іменах, вони можуть спричинити проблеми в будь-якому з наступних сценаріїв:

  • Ви ділитесь своєю файловою системою з іншими комп'ютерами, зокрема з різними операційними системами;
  • Ви ділитесь файлами з іншими (і хоча електронна пошта, як правило, непогана з перетвореннями, іноді це просто не працює);
  • Ви використовуєте сценарії оболонки для автоматизації деяких завдань (пробіли особливо проблематичні, хоча існує багато способів впоратися з ними);
  • Ви використовуєте спільний доступ до файлів з іншого комп'ютера.

...


3

Дотримуйтесь буквено-цифрових імен. Уникайте пробілів або замінюйте пробіли підкресленнями (_). Обмежте розділові знаки в іменах файлів періодами (.), Підкресленнями (_) та дефісами (-). Як правило, імена файлів бувають малі, але я використовую CamelCase, коли в імені файлу є кілька слів.

Використовуйте розширення, які вказують на тип файлу. Програми не потребують розширень, оскільки біт виконання використовується для позначення програм, а оболонки знають, як запускати програми різних типів. Це загальне, але не обов'язкове для (.sh) для скриптів оболонки та (.pl) для скриптів perl. Виконані розширення Windows .bat, .com, .scr і .exe вказують на Unix виконувані файли Windows.

Виберіть стандарт і дотримуйтесь його. Але це не зламає речі, якщо уникнути цього.

Приховані (або крапкові) файли мають імена, починаючи з періоду. Зазвичай вони не відображаються у списках каталогів. Використовуйте 'ls -a', щоб включити в список файли крапок.


5
CamelCase - це анти-візерунок на Unix. ОП розпитували про конвенції.
Мікель

2
Це не "погано" проти "добре". Це "так зазвичай робиться". Це конвенція, яку просила ОП. Причина? Це може бути тому, що людям Unix не подобається натискання Shift, це може бути тому, що в старих системах було ПОВНІШНЕ, або з іншої причини. Я не впевнений.
Мікель

@Mikel Я також програмую Java, де CamelCase є умовою. Іноді закономірності та умовності конфліктують.
BillThor

.scr - це також розширення для виконання файлів Windows.
LawrenceC

1
@ultrasawblade Спасибі, показує, як часто я скриптую Windows. Я намагався пропустити більш рідкісні виконувані розширення, такі як cmd, pif, vb *, wsh та інші.
BillThor

2

Одна умова - використовувати "_" для заміни пробілів як роздільників між словами. Інші символи можуть бути використані для заміни пробілів, але є дещо сильніші звичайні використання для "-" та "." в іменах шляхів, тому "_" зазвичай є кращим.

Пробіли є законними в іменах шляхів, але їх умовно уникати, оскільки вони вимагають цитувати ім'я шляху ("foo bar") або уникати пробілів (foo \ bar). Правильно написаний скрипт оболонки цитуватиме змінні, які можуть містити пробіли, зокрема імена шляхів, але якщо цього не зробити, це звичайний контроль, і це багато зайвого введення при виконанні разової команди, введеної в командному рядку.

Використання "-" для розділення кластерів чисел, як у часових позначках або порядкових номерах, - це звичай, який зазвичай використовується поза контекстом файлових систем. Використання "." відокремити "розширення файлів", які вказують на тип файлу, є дуже поширеним, і від нього залежать деякі важливі інструменти. Наприклад, система управління пакетами в Red Hat Enterprise Linux та його похідних, RPM, очікує, що файли пакунків закінчуються на ".rpm". Традиційний тарбол - це файл tar (".tar"), який був gzipped (".gz"), і так закінчується на ".tar.gz".

Таким чином, складаючи їх разом, ви часто стикаєтесь з іменами, схожими на "home_backup_2017-07-01.tar.gz"


2

використання -або _для іменування файлів
_для функцій
.для розширень

cat << EOF > foo-bar.sh  
foo_bar() {  
echo baz  
}  
EOF  

0

Я погоджуюсь з Девідом Оніллом, що ви просто хочете щось піти.

Але приємно, якщо файли можна сортувати в одному режимі, тому не роблять номер 0 ..10, а номер 00 ..10.

Використовуючи дати в іменах, перейдіть до стандартного формату дати, наприклад ISO8601 .

І не бійтеся використовувати кілька символів для розділення логічних частин в імені. Якщо ви використовуєте _ (це було 3 _), згодом ви можете спростити регулярні вирази для імен файлів.

Тож ваш приклад може бути приблизно таким:

backup_2011-06-19T114012___part002___random

Легко читати і легко розбирати сценарії.


0

Слова у назві файлу можуть бути розділені _або -згідно з умовами Unix.

Якщо ви користуєтесь -, це простіше вводити, рятує від натискання клавіші SHIFT. Але так як -займає так мало місця, порівняно з ними читати розділення слів трохи важко _. Використання _для розділення слів робить його набагато чистішим, оскільки _займає більше місця.

У сценаріях оболонок та інших комп'ютерних програмуваннях _використовуються для багатословних змінних, наприклад MY_ENVIRONMENT_FILE. Створення імена файлів використовувати , _а також зберігає його послідовно MY_ENVIRONMENT_FILE=~/my_environment_file.

У веб-розробці -віддається перевага для іменування файлів. Однією з причин є, мабуть, те, що підкреслення в веб-посиланнях може приховати підкреслення і може ускладнити його, якщо ви вводите веб-посилання вручну.

У більшості редакторів, а також веб-сторінок this_long_wordможна повністю вибрати двічі, але ні this-long-word.


Гммм, чому ви читаєте свої назви файлів шрифтом змінної ширини? Відкрийте свій термінал і -і _взяти тільки точно такий же простір! :)
Wildcard

Ха-ха, ти маєш рацію. Я використовую SourceCodePro + Powerline + Awesome Regular латовий шрифт. Навіть з однопросторовими шрифтами _виглядає чистіше, хоча займає той самий простір, що і для -. Я повинен був вживати слово "мабуть". Щодо _та -при використанні монопросторових шрифтів, різницю можна найкраще пояснити за допомогою цієї аналогічної картини: evsc.net/v8/wp/wp-content/uploads/2010/09/…
GMaster

-1

Однозначно є стандарт для Linux. Якщо ви подивитеся на назви файлів у будь-якій системі Linux, вони з малі знаки мають тире: / usr / bin / ssh-keygen. Це вказано в одному з документів Бази стандартів Linux, який я зараз не можу знайти. Він також визначений GNU, який говорить про те, щоб використовувати підкреслення для імен змінних та тире для імен файлів.


-2

Щоб додати те, що всі інші сказали:

1-Навіть незважаючи на те, що Linux не надто дбає про розширення, Windows, так що будь-який файл, який ви плануєте надавати комусь, має відповідне розширення.

2-Камельові шапки здаються найпростішими у використанні сценаріями, без спеціальних символів, які б турбувались про послідовності втечі.


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