Jakie znaki są bezpieczne w nazwach plików między platformami dla systemów Linux, Windows i OS-X

60

Obecnie używam YYMMDD-NAME+PAGEnazwy dla większości moich plików. NAMEma spacje przekonwertowane na podkreślenia.

Chciałbym użyć YYYY-MM-DDformatu daty, ale nie jestem pewien, jak oddzielić go od nazwy. -Wyglądałby dziwnie, jeśli nazwa rozpoczął się od cyfry. Jeśli _użyję znaku a , spowoduje to konflikt z podkreśleniem reprezentującym spację.

Jakie znaki są wystarczająco bezpieczne w nazwach plików, które by tu działały? Korzystam z systemu Linux, ale mogę udostępniać pliki innym osobom (Windows 7, Mac OS X).

Martin Ueding
źródło
… W systemach Unix, Windows, Amiga 1000?
slhck 18.11.11
Głównie nowoczesny Linux.
Martin Ueding
- symbol jest bezpieczny w użyciu na Windows 7 .. może być inny nowoczesny system operacyjny zrobić to samo .. możesz użyć symbolu minus, aby oddzielić ..
Niranjan Singh
możliwy duplikat krzyżowy witryny: stackoverflow.com/questions/4814040/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

48

Podsumowanie:

  • Windows: wszystko oprócz znaków kontrolnych ASCII i \/:*?"<>|
  • Linux, OS-X: wszystko oprócz null lub /

Na wszystkich platformach najlepiej unikać znaków niedrukowalnych, takich jak znaki kontrolne ASCII.

Windows

W systemie Windows Eksplorator Windows nie zezwala na znaki sterujące lub \/:*?"<>|możesz używać spacji. Jeśli używasz spacji, często będziesz musiał podać nazwę pliku, gdy jest używany z wiersza poleceń (ale o ile wiem, nie ma to wpływu na aplikacje GUI). System plików Windows, taki jak NTFS, najwyraźniej przechowuje kodowanie z nazwą pliku, ale UTF-16 jest standardem.

W niektórych częściach systemu Windows rozróżniana jest wielkość liter, w innych częściach rozróżniana jest wielkość liter. Łatwo jest tworzyć różne nazwy plików, takie jak „Ab” i „ab” w systemie plików Windows NTFS. Nazwy te odnoszą się do oddzielnych plików, które zawierają odrębną oddzielną treść. Jednak chociaż wiersz polecenia systemu Windows chętnie wyświetla oba pliki przy użyciu dir, nie można łatwo uzyskać dostępu do jednego z nich ani nim manipulować za pomocą takich poleceń, jak type. Patrz poniżej.

Linux, OS-X

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

Wniosek

Prawdopodobnie mógłbyś bezpiecznie użyć czegoś takiego (gdyby nie było tak trudno pisać)


Czułość na (w) w systemie Windows

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

Zauważ, że nie możemy wpisać zawartości drugiego pliku, typepolecenie Windows po prostu zwraca zawartość Ab. Trzeci plik również różni się od aB w Linuksie.

(Windows 10 NTFS).

RedGrittyBrick
źródło
1
W sumie dobra odpowiedź, ale powstrzymam się od używania nazw plików w spacjach. Właściwe ich ucieczka we wszystkich kontekstach jest większym problemem niż jest warta. Zauważ, że Microsoft przestał używać spacji w nazwach katalogów systemowych. Jeśli musisz wskazać granice słów w nazwach, CamelCase działa dobrze.
Isaac Rabinovitch
4
„C: \ Program files (x86)” nadal istnieje w Win8 - czy to nie jest katalog systemowy? Zgadzam się, że spacje mogą powodować problemy.
RedGrittyBrick
Tak jest, ale można go zmienić na prawie wszystko. Oczywiście wiele programów przerazi się, jeśli zmienisz nazwę na „]: \ foobar”, ale Windows i tak nazywa to „% programfiles (x86)%”.
Marcks Thomas
2
Należy pamiętać o tym, że system Linux może traktować wielkie i małe litery jako odrębne, podczas gdy Windows uważa je za takie same.
thecoshman
1
Byłbyś zaskoczony, jak wiele programów wysysa parsowanie. Właśnie dlatego nie było Windows 9.
Isaac Rabinovitch
46

Chociaż odpowiedź RedGrittyBrick jest technicznie poprawna, bezpieczeństwo nie jest jedynym problemem: użyteczność jest również ważna. Wydaje mi się, że lepszym pytaniem jest „jakie znaki warto zastosować w nazwie pliku”.

Niektóre potencjalne wytyczne:

  • [0-9a-zA-Z_] - Znaki alfanumeryczne i podkreślenie są zawsze odpowiednie.
  • \/:*?"<>|a bajt zerowy jest problematyczny w co najmniej jednym systemie i zawsze należy go unikać.
  • Spacje są używane jako separatory argumentów w wielu systemach, dlatego w miarę możliwości należy unikać nazw plików ze spacjami. Inne białe znaki (np. Tabulatory) tym bardziej.
  • Średniki (;) służą do oddzielania poleceń w wielu systemach. Średniki i przecinki (,) służą do oddzielania argumentów wiersza poleceń w (niektórych wersjach?) Wiersza poleceń systemu Windows.
  • []()^ #%&!@:+={}'~i [ `] wszyscy mają specjalne znaczenie w wielu muszli, i są irytujące, aby obejść, a więc należy go unikać. Wyglądają też okropnie w adresach URL .
  • Wiodące postacie, których należy unikać:
    • Wiele programów wiersza poleceń używa łącznika [-] do wskazywania specjalnych argumentów.
    • * Systemy oparte na nix używają kropki [.] jako wiodącego znaku dla ukrytych plików i katalogów.
  • Wszystko, co nie znajduje się w zestawie ASCII, może powodować problemy w starszych lub bardziej podstawowych systemach (np. Niektóre systemy osadzone) i należy z nich korzystać ostrożnie.

Zasadniczo pozostawia Ci to:

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

które są zawsze bezpieczne i nie denerwujące w użyciu (pod warunkiem, że nazwa pliku zaczyna się od alfanumerycznej) :)

naught101
źródło
1
Nawiasy klamrowe ( []) są częścią wyrażeń regularnych i mają również specjalne znaczenie w powłoce. Ale nie są tak źli do pracy, z wyjątkiem niektórych złych przypadków w rogu.
Martin Ueding
1
Hrm ... Chyba to samo można powiedzieć ().
naught101
4
W Zsh znaki, które mogą być interpretowane w różny sposób, obejmują []()^;, więc myślę, że właściwą odpowiedzią może być [0-9a-zA-Z.,_-]przecinek, można również wykluczyć tylko dlatego, że dziwnie jest widzieć w nazwie pliku, chociaż nie mogę wymyślić rzeczywistego przypadku, w którym spowodowałoby to problemy.
Casey Rodarmor,
tak, usunąłem je z ostatecznej listy
naught101
1
przecinek może być denerwujący, spróbuj echo whereami > a,b,cw oknie wiersza polecenia Win10.
RedGrittyBrick
4

Mógłbyś:

  1. zamień obecne podkreślenia na #(symbol korektora dla spacji)
  2. podkreślenie daty „sekcja” z nazwy pliku (lub drugiego myślnika - łatwiejsze do wpisania)

Alt-1. wielkie litery mogą zastępować spacje: YYMMDD-HHMM-FileName.extlubYYMMDD-HHMM_FileName.ext

Minimalne znaki dla wyraźnego wyświetlania, które automatycznie sortują z dopełnionymi zerami dla stycznia-września (i 1 -9 ea mo).

tb01
źródło