Mówi się, że w Unixie i Linuksie należy unikać spacji w nazwie pliku (zwykły plik, katalog, link, plik urządzenia, ...).
Ale robię to cały czas. W przypadku nazwy pliku ze spacją w środku,
- W Nautilus znak spacji jest pokazany jako spacja.
- W terminalu Bash albo używam
\
do reprezentowania spacji, albo umieszczam nazwę pliku w parze podwójnych cudzysłowów. - w plikach niektórych aplikacji (Nautilus, nie jestem pewien, czy system operacyjny to zrobi), nazwa pliku jest zapisywana z zastąpioną spacją
%20
.
Czy spacja w nazwie pliku jest naprawdę niedozwolona?
Jak prawidłowo używasz lub radzisz sobie ze spacją w nazwie pliku?
-rf ~
(użyjtouch -- "-rf ~"
), ale nie poleciłbym tego./
separator). Wykorzystanie wszystkich 254 pozostałych bajtów otwiera drzwi do wszystkich sposobów niewypowiedzianych eldritchowych „nazw”. Oczywiście jest to szalone, ale nie wszyscy zgadzają się co do tego, co jest „rozsądne”, a różne postacie będą łamać różne narzędzia. Przecięcie zdrowego rozsądku wszystkich jest dość małe .Odpowiedzi:
Spacje, a nawet każda postać oprócz
/
NUL, są dozwolone w nazwach plików. Zalecenie, aby nie używać spacji w nazwach plików, wiąże się z niebezpieczeństwem, że mogą zostać źle zinterpretowane przez oprogramowanie, które źle je obsługuje. Prawdopodobnie takie oprogramowanie jest wadliwe. Ale prawdopodobnie również języki programowania, takie jak skrypty powłoki, sprawiają, że pisanie oprogramowania, które psuje się, gdy zawiera nazwy plików ze spacjami, sprawia, że jest to zbyt łatwe. Błędy te często się prześlizgują, ponieważ skrypty powłoki nie są często testowane przez programistów używających nazw plików ze spacjami w im.Zastępowane spacje
%20
nie są często widoczne w nazwach plików. Jest to najczęściej używane w przypadku adresów URL (internetowych). Chociaż prawdą jest, że kodowanie% z adresów URL czasami trafia do nazw plików, często przypadkowo.źródło
bash
. Próbowałem kilku rzeczy, takich jak cytowanie go za pomocą Ctrl-V i coś podobnego,$(echo -e \\0)
ale to nie działało. Chodzi o to, że NUL nie może być używany w nazwach plików, ponieważ nie można go używać w ciągach C (ponieważ jest to terminator ciągów), a wszystkie podstawowe interfejsy API, a także praktycznie wszystkie ciągi obsługiwane przez programy C używają tego formatu . Ponieważbash
jest napisane w C, może po prostu nie mieć żadnego wsparcia dla łańcuchów z NUL. Mogę się mylić, może być jakiś niejasny sposób ...NUL
i walić , potrzebujesz$'\0'
. Na przykład:find . -print0 | while read -d $'\0' f; do echo "$f"; done
Jak zauważyłeś, spacje są dozwolone w nazwach plików.
Jeśli spojrzysz na pozycję „większość systemów plików UNIX” na tym wykresie w Wikipedii , zauważysz:
Dowolny 8-bitowy zestaw znaków jest dozwolony. Możemy również przejąć 7-bitowy kod ASCII pod tym parasolem, ponieważ jest on podzbiorem różnych zestawów 8-bitowych i zawsze jest implementowany przy użyciu 8 bitów.
Jedynymi zabronionymi postaciami są
/
„null”. „Null” odnosi się do bajtu zerowego, ale i tak nie są one dozwolone w danych tekstowych.Jeśli jednak skorzystasz z powłoki, możesz zdać sobie sprawę, że istnieją pewne postacie, które spowodują kłopot, a co najważniejsze
*
, jest operatorem globowania POSIX.W zależności od tego, jak chcesz zdefiniować „kłopotów”, to mogłoby zawierać białych znaków (spacje, tabulatory, znaki nowej linii, etc.) w tym kraju, co stwarza potrzebę cytowania z
""
. Jest to jednak nieuniknione, ponieważ dozwolone są spacje, więc ...W kontekście powłoki / wiersza poleceń zawiń nazwę pliku w pojedyncze lub podwójne cudzysłowy (ale pamiętaj, że nie są to te same inne problemy WRT), lub użyj spacji
\
, np .:źródło
touch $(echo -e "foo\00bar")
--e
przetwarzanie\0N
jako wartość ósemkowa, ale gdzieś się gubi, ponieważ to po prostu tworzy plik o nazwiefoobar
. Oczywiście NULL nie jest drukowalny, ale gwarantuję, że zniknął z powodu ograniczenia ciągu C.foo[NULL]bar
jakfoo
w większości zamiarów i celów. Fakt, że tak się nie dzieje,echo -e
pokazuje, że NULL został gdzieś przycięty./
który jest separatorem katalogu i nie może być cytowany, więc może znajdować się w nazwie ścieżki ale nie w nazwie pliku).Przyczyna jest w dużej mierze historyczna - powrót do mgieł przestrzeni czasowej nie był dozwolony w nazwach plików, więc spacje zostały użyte jako separatory słów kluczowych / nazw plików. Przyszłe interpretery powłok musiały być kompatybilne odwrotnie ze starymi skryptami, dlatego utknęliśmy w bólu głowy, który mamy dzisiaj.
Deweloperzy procesów, które nie muszą zbytnio zajmować się ludźmi, mogą znacznie, znacznie uprościć, całkowicie usuwając spacje. Apple to robi, zawartość / System / Library / CoreServices / zawiera bardzo niewiele spacji, programy ze spacjami są otwierane w imieniu użytkownika, aWouldLookStrangeIfCamelCased. Podobne ścieżki tylko dla Uniksa również unikają spacji.
(nieco pokrewna anegdota: w połowie lat 90. dron Windows powiedział „Wymień jedną rzecz, którą możesz zrobić na komputerze Mac, czego nie mogę zrobić w systemie Windows” -> „Użyj 12 znaków w nazwie pliku”. -> Cisza. Przestrzenie były możliwe również dla tych 12 znaków)
źródło
Tak więc, jak wielokrotnie stwierdzono w innym miejscu, nazwa pliku może zawierać prawie dowolny znak. Ale trzeba powiedzieć, że nazwa pliku jest nie plik. Ma on pewną wagę jako atrybut pliku, ponieważ zazwyczaj potrzebujesz nazwy pliku, aby otworzyć plik, ale nazwa pliku wskazuje tylko rzeczywisty plik. Jest to link przechowywany w katalogu, który go nagrał, wraz z numerem i-węzła - co jest znacznie bliższe rzeczywistemu plikowi .
Więc, nazywaj to jak chcesz. Jądro to nie obchodzi - wszystkie obsługiwane przez niego odwołania do plików zajmą się prawdziwymi liczbami i-węzłów. Nazwa pliku jest przeznaczona do spożycia przez ludzi - jeśli chcesz sprawić, że będzie szalona, to twój system plików. Tutaj zrobię trochę szalonych rzeczy:
Najpierw utworzę 20 plików i nadam im nazwy bez spacji, przy czym każda nazwa pliku zawiera o jedną spację więcej niż ostatnia:
To trochę zabawne. Spójrz na moje
ls
:Teraz mam zamiar wykonać kopię lustrzaną tego katalogu:
Oto
../mirror/
zawartość:Ok, ale może pytasz - ale co to za dobro? Jak rozpoznać, który jest który? Jak możesz być pewien, że podłączyłeś odpowiedni numer i-węzła do właściwej nazwy pliku?
Dobrze...
WYDAJNOŚĆ
Zobacz, zarówno numer
../mirror/"${tgt%% .*}"
i- węzła zawarty w, jak i ten, do którego./' '
odwołuje się, odnoszą się do tego samego pliku. Opisują ten sam plik. Oni to nazywają, ale nic więcej. Nie ma w tym żadnej tajemnicy, tylko pewne niedogodności, które możesz zrobić dla siebie, ale które ostatecznie będą miały niewielki lub żaden wpływ na działanie twojego systemu plików Unix.źródło