Czy używanie nazw plików w systemie Linux jest poprawne?

18

Czy jest to prawidłowe stosowanie pewnych znaków specjalnych, jak +, &, ', .(kropka) i ,(przecinek), w zasadzie, w nazwach plików.

Rozumiem, że możesz używać -i _bez problemu, ale podczas niektórych badań nie udało mi się znaleźć czegoś konkretnego w innych symbolach; niektórzy twierdzą, że możesz, niektórzy twierdzą, że nie, a niektórzy twierdzą, że „nie zachęca się” ich do korzystania (cokolwiek to oznacza).

Chris Klein
źródło
Z jakich programów korzystasz do pracy z tymi plikami. Tylko programy, które interpretują niektóre znaki w specjalny sposób (np. Powłoki na niecytowanych ciągach) będą dawały problemy. Przeciętny program C bierze wszystko, co nie jest równe NUL, bez mrugnięcia okiem.
Anthon
9
Co rozumiesz przez „poprawny”?
David Richerby
Problem ze stosowaniem znaków specjalnych w nazwie pliku polega na tym, że zwiększa to ryzyko, że jakiś błędny fragment kodu źle zinterpretuje nazwę pliku. Nie sądzę jednak, aby którykolwiek z wymienionych przez ciebie znaków mógł powodować jakiekolwiek problemy. Miałbyś więcej problemów z białymi znakami, których ogólnie należy unikać . A w szczególności EOL należy unikać za wszelką cenę.
System Windows ma surowsze ograniczenia dotyczące tego, co może być w nazwie pliku, więc jeśli istnieje szansa, że ​​pliki będą musiały zostać tam użyte, należy na to zwrócić uwagę.
evilsoup

Odpowiedzi:

28

Czy poprawne jest używanie niektórych znaków specjalnych, takich jak +, &, ',. (kropka) i (przecinek), w zasadzie, w nazwach plików.

Tak.

Prawidłowe, ale niekoniecznie wskazane lub wygodne.

W nowoczesnych systemach plików Unix i Linux można używać dowolnych znaków oprócz null i/ nazwy pliku.

Możesz użyć interpunkcji ASCII . Niektóre narzędzia używają znaków stop ( kropek ) i przecinków w nazwach plików, które tworzą.

Możesz używać znaków kontrolnych ASCII , jednak jest to niewskazane, ponieważ jest mało prawdopodobne, aby były wyświetlane w sposób akceptowalny i są trudne w użyciu.

Możesz używać metaznaków powłoki, takich jak ampersand ASCII i apostrof ASCII. Jest to jednak niewygodne i wymaga, aby podczas konstruowania poleceń zwracać szczególną uwagę na cytowanie lub unikanie takich znaków.

Możesz używać znaków wielobajtowych, używając różnych kodowań. Do powłoki i / lub narzędzi należy poprawna interpretacja i wyświetlanie znaków spoza ASCII. Wskazane jest ograniczenie się do popularnego kodowania, takiego jak UTF-8 i odpowiednie ustawienie regionalne.

Będziesz mieć najmniej problemów z używaniem znaków drukowalnych ASCII, ograniczając zestaw znaków interpunkcyjnych do tych, które nie są meta-znakami powłoki i nie rozpoczynając nazwy łącznikiem (lub znakiem stop - chyba że chcesz ukryć plik).

RedGrittyBrick
źródło
23

Jak stwierdzili inni, we współczesnych systemach Unix / Linux nazwy plików mogą zawierać dowolne znaki oprócz \0 (NUL) i /(ukośnik).

Ponadto standard POSIX definiuje przenośny zestaw znaków dla nazw plików:

3.278 Zestaw znaków przenośnej nazwy pliku

Zestaw znaków, na podstawie których tworzone są przenośne nazwy plików.

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 . _ -

Ostatnie trzy znaki to odpowiednio <okres>, <undrescore> i <łącznik>. Zobacz także Pathname .

pathchkNarzędziowy z GNU Coreutils kontroli na tym, kiedy wywołana z -popcji, a -Popcja będzie ostrzegać o pustymi nazwami plików (które nie są ważne, ale mogą być przekazywane jako argument pathchk) i nazwy plików zaczynające się od myślnika ( -).

nyuszika7h
źródło
9

Najbezpieczniejszym zakładem jest odwołanie się do wpisu w Wikipedii dotyczącego dozwolonego zestawu znaków dla dowolnego systemu operacyjnego. Można go znaleźć stąd .

Na przykład w większości systemów opartych na Uniksie dozwolony zestaw znaków to 8 bitów, a znak zarezerwowany to znak null (NUL,'\0' ). Nie jest jednak dobrą praktyką stosowanie znaków specjalnych w nazwach plików, ponieważ stanowią one problem podczas ich usuwania.

Na przykład mogę mieć nazwę pliku jako -ramesh.txti próbuję go usunąć jak poniżej.

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.

Muszę usunąć plik, ponieważ

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

Więcej szczegółów można również znaleźć w tej odpowiedzi .

/Uważam, że w Linuksie i OS-X tylko zestaw ASCII do wydruku jest zabroniony. Niektóre znaki (takie jak metaznaki powłoki *?!) powodują problemy w wierszach poleceń i wymagają odpowiedniego cytowania lub zmiany znaczenia nazwy pliku.

Systemy plików Linux, takie jak ext2, ext3, są agnostyczne dla zestawu znaków (myślę, że traktują to mniej więcej jako strumień bajtów - tylko wartości zerowe i /są zabronione). Oznacza to, że możesz przechowywać nazwy plików w kodowaniu UTF-8. Sądzę, że od powłoki lub innej aplikacji zależy, jakiego kodowania użyć, aby poprawnie przekonwertować nazwę pliku do wyświetlania lub przetwarzania.

Podsumowując, problemem nie jest użycie znaków specjalnych w nazwach plików, ale sposób ich obsługi.

Ramesh
źródło
Z tego powodu („jak sobie z nimi poradzić”) prawie wyłącznie używam tylko liter, cyfr, znaków podkreślenia i kropek, choćby po to, aby ułatwić mi życie, gdy później zdecyduję, że muszę używać programów wiersza polecenia do robienia rzeczy z moimi plikami (który wydaje się zawsze pojawiać co najmniej raz).
phyrfox
19
Nie opowiadaj się za nazwami plików zaczynającymi się od, -ale mówiąc precyzyjnie: 1) na pewno nie potrzebujesz cudzysłowów wokół tej nazwy pliku, 2) zamiast specjalnego --argumentu możesz zrobić dokładnie to, co rmsugeruje: a rm ./-ramesh.txtwięc nie musisz tego robić dokładnie tak, jak sugerujesz.
Michał Politowski
@ MichałPolitowski Nie tylko nie potrzebujesz cytatów, ale mają one dokładnie zerowy efekt.
ctrl-alt-delor
4

Twoje badania są prawie prawidłowe. W nazwach plików można używać znaków specjalnych, ale nie jest to wskazane, ponieważ znaki te mają specjalne znaczenie. Konwencje nazewnictwa plików w systemie Linux opisują również inne ograniczenia nazw plików, takie jak „Nazwy plików nigdy nie powinny zaczynać się od myślnika”.

Prosty przykład wykonywania operacji w wierszu polecenia za pomocą znaków specjalnych w nazwach plików.

Jako osobistą notatkę wolę unikać znaków specjalnych w nazwach plików, ponieważ wymagają one szczególnej uwagi, gdy pliki te są wykorzystywane do dowolnego przetwarzania. W ten sposób eliminuje się obawy związane ze stosowaniem znaków specjalnych w procesie rozwoju.

Po prostu ja
źródło
1
Więc radzę byłoby użyć tylko -, _i .(kropka) w nazwach plików?
Chris Klein
@ChrisKlein, tak, choć nie na początku nazwy pliku.
Simply_Me
Szczególne znaczenie ma program (np. Twoja powłoka), a nie nazwa pliku. Prawie wszystkie programy w U&L w ogóle nie dbają o znaki, o ile w nazwie pliku nie ma wartości NUL.
Anthon
@Anthon, tak, moja powłoka zgodnie z opisem w linku.
Simply_Me
2
Jako osobistą notatkę polecam programistom nadającym folderowi nadrzędnemu nazwę projektu, na przykład „föλder \ t☃” - aby natychmiast zauważyli, że popełni błąd, który psuje takie nazwy plików, zamiast publikować uszkodzony kod lub pliki binarne że inni muszą się obejść. Używanie go nie stanowi problemu, o ile jest to jedyny, który zaczyna się na „f”, uzupełnianie tabulatorami w dowolnej powłoce wprowadzi trudne do wpisania rzeczy.
Peteris,