Nazwy plików Linux / Windows / Unix /…: Jakie znaki są dozwolone? Które są nieskalowane?

43

Które znaki są dozwolone, a które z nich należy wstawić w wierszu poleceń w różnych systemach operacyjnych?

java.is.for.desktop
źródło
Poniżej znajduje się kilka przydatnych odpowiedzi, ale co próbujesz osiągnąć? Kodowanie własnych procedur umieszczania na białej liście prawdopodobnie nie jest najlepszą drogą.
medyna
Dziękuję wszystkim! Wszystkie odpowiedzi są pomocne. Potrzebuję tych informacji: piszę narzędzie, które oznaczałoby pliki w systemie plików, zmieniając ich nazwy (bez metadanych).
java.is.for.desktop
Zobacz także odpowiedź na temat administratora .
pevik

Odpowiedzi:

27

Dyskusja na temat znaków nazw plików znajduje się w artykule Wikipedii na temat nazw plików .

Ten esej może ci się przydać: Naprawianie nazw plików Unix / Linux / POSIX .

W tym artykule porównano OS X i Windows XP: X vs. XP: Zabronione znaki w nazwach plików (PDF, patrz str. 64–66).

Rzeczy, które nie powinny znajdować się w nazwach plików za 1000 $ Alex

Nie wiem, jakie znaki muszą być un -escaped, ale w Linuksie, to chyba nie jest dobry pomysł, aby uniknąć znaki, które mogą mieć szczególne znaczenie takie jak „n” (nowa linia), „t” (TAB) i innych, ale generalnie nie stanowi to problemu w operacjach na plikach. Być może masz na myśli raczej „uciekł” niż „nieskalowany”. Najczęściej spotykane są te, które powłoka będzie interpretować, takie jak spacja, „>”, „<” itd. Zobacz niektóre artykuły, które podłączyłem, aby je omówić.

Dennis Williamson
źródło
7
To nie jest tak naprawdę odpowiedź - wszystkie informacje są zewnętrzne. A niektóre z tych linków są teraz zepsute.
Steve Bennett,
26

Jedynymi znakami niedozwolonymi w nazwie pliku w * nix są NULi /. W systemie Windows, tylko NUL, :i \są naprawdę nie jest dozwolone, ale wiele aplikacji, które dodatkowo ograniczają także zapobieganie ?, *, +, i %.

W żadnym momencie znaki w nazwie pliku nie muszą być poprzedzane znakami, chyba że jest to wymagane, aby nie były interpretowane przez powłokę.

Ignacio Vazquez-Abrams
źródło
Drugi punkt zasługuje na podkreślenie. Zazwyczaj „ucieczka” odnosi się do mechanizmu powłoki, który umożliwia użytkownikowi określenie ciągów znaków (np. Ścieżek) zawierających znaki, które w przeciwnym razie powłoka traktowałaby w specjalny sposób. Jeśli OP oznacza użycie czegoś takiego jak „kodowanie procentowe” do kodowania znaków niedozwolonych w inny sposób, to jest to „protokół ścieżki” na poziomie aplikacji, który każdy zaangażowany program musi przyjąć (lub nie).
Chris Johnsen,
Skanuję folder za pomocą readdir, a następnie próbuję otworzyć pliki o nazwach, które zwraca. Niektóre z nich nie otwierają się przy pomocy ENOENT, co sugeruje, że nawet dla systemu operacyjnego czasem trzeba uciec?
gman
13

Jeśli utworzysz plik w systemie Windows za pomocą Eksploratora przy użyciu jednego z następujących znaków, będzie to narzekać, że znaki nie są dozwolone:

\ / : * ? " < > |

Dobry odnośnik znajduje się tutaj:

Nazewnictwo plików, ścieżek i przestrzeni nazw
http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx

Microsoft stwierdza dalej:

„... na platformach komputerowych z systemem Windows nieprawidłowe znaki ścieżki mogą zawierać znaki ASCII / Unicode od 1 do 31, a także cudzysłów (”), mniej niż (<), większy niż (>), potok (|), backspace (\ b), null (\ 0) i tab (\ t). "

http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars.aspx

Greg Askew
źródło
Pamiętam, jak przeczytałem kilka lat temu, że Windows w trybie użytkownika ma te ograniczenia, a także nie rozróżnia wielkości liter („ABC.txt” === „abc.txt”). Jednak system Windows w trybie jądra ma mniej ograniczeń i rozróżnia małe i wielkie litery („ABC.txt”! == „abc.txt”, podobnie jak * NIX). Jednak dla wszystkich celów i celów powyższe znaki będą miały zastosowanie do większości programów, ponieważ działają one w trybie użytkownika.
CubicleSoft
Mogę uciec \ / : * ? " < > |od nich wszystkich i utworzyć je za pomocą mkdir na moim systemie GNU / Linux. Możesz także użyć mkdir '?'do utworzenia ?katalogu. Użyłem ramdysku i systemu plików XFS do przetestowania tego.
S.Goswami,
5

W systemie Linux i innych systemach zgodnych z POSIX „/” jest zarezerwowane, ponieważ jest separatorem katalogów, a „\ 0” (znak NULL) oznacza koniec łańcucha. Wszystko inne jest dozwolone.

janneb
źródło
1
Chociaż zdecydowanie zaleca się unikanie znaków nowej linii, tabulatorów, znaków kontrolnych itp. Oraz upewnienie się, że nazwa pliku jest poprawna UTF-8.
Flimm,