Jak zmienić nazwę pliku na ... (kropka)?

26

Najwyraźniej możesz zmienić nazwę pliku na... .

Gdybym był szalony, jak zmieniłbym nazwę pliku na ..lub .? Czy taka nazwa pliku jest w ogóle dozwolona?

Odwrotny ukośnik nie wyłącza specjalnego znaczenia kropki:

$ mv test \.
mv: `test' and `./test' are the same file
gronostaj
źródło
11
.i ..już istnieją. I kropka nie ma specjalnego znaczenia.
ctrl-alt-delor
2
Zastanawiam się, czy możesz utworzyć pliki o nazwie .lub ..z systemu Windows na nośniku zewnętrznym FATlub NTFSnośniku, a następnie spróbuj zainstalować to w systemie uniksowym. Hm ...
IQAndreas
3
@IQAndreas nie, system Windows używa. i .. mniej więcej tak samo ( superuser.com/a/571364/330318 ) jak Unix. (I do cholery, wiele innych specjalnych nazw: superuser.com/a/217526/330318 )
PTwr
2
@PTwr Historia Windowsa jest trudniejsza. Niektóre specjalne rzeczy dzieją się na poziomie systemu plików / NT API, niektóre w podsystemie Win32, a niektóre i na poziomie powłoki. Na przykład magia GUID z drugiego łącza znajduje się na poziomie powłoki, więc nie zobaczysz ich w typowej aplikacji z linii poleceń. Nie jestem pewien, czy .i ..rzeczywiście istnieje w systemie plików NTFS i NT API lub jeśli są one dodawane tylko przez API Win32. Wiem, że istnieje kilka rozbieżności między API NT niższego poziomu i Win32, na przykład Win32 ukrywa kilka plików z katalogu głównego dysku.
CodesInChaos
@CodesInChaos, o ile mi wiadomo, kropka / kropka są instancjami wirtualnymi i są emulowane w sterowniku systemu plików, podobnie było w starym FAT-ie, który pożyczył ( problematyczny ) pomysł od Uniksa. Jak na drugi link, przyznaję, że nie przeczytałem go w pełni przed opublikowaniem. Coś takiego jak ten prawdopodobnie byłoby lepsze. (ale znowu ten brak pełnej informacji ./ ..)
PTwr

Odpowiedzi:

25

.. nie jest wyjątkowy, po prostu istnieje.

W systemach Unix, Dos i MS-Windows każdy katalog ma katalog, do .którego prowadzi z powrotem, i katalog .., do którego prowadzi do swojego katalogu nadrzędnego (lub self, jeśli katalog główny).

Jeśli ..i .to specjalne to tylko dlatego, że nie można ich usunąć (właściwie można, po prostu usunąć katalog zawierający je).

Dlatego nie możesz nazwać żadnego (innego) pliku .lub ...

Jednak można tworzyć pliki ..., \, , .. (uwaga jest przestrzeń po .., ale ledwie można zobaczyć go tutaj, albo łatwo w ciebie katalogu liście) lub innej nazwy lubisz; Tylko zastrzeżone znak jest /(Ostrzeżenie - zaawansowane szczegóły: a null, null to specjalny charakter, nie wykorzystane do niczego z wyjątkiem zaznaczyć koniec rzeczy, a czasami jako separator). .nie ma specjalnego znaczenia: nie do nazw plików, jądra ani do powłoki, nie wymaga ucieczki. W rzeczywistości, jeśli nazwa pliku zaczyna się od, .to jest wyjątkowa, plik jest zwykle ukryty, ale nadal nie wymaga ucieczki.

Na bok

Ten plik ukryty zachowanie doszło we wczesnej realizacji lsktórym autor chciał ukryć .i ..tak pisali kod, aby ukryć wszystkie pliki rozpoczynające się .. Inni użytkownicy zauważyli ten błąd / funkcję i zaczęli tworzyć pliki, zaczynając od .momentu, w którym chcieli ukryć plik.

Wyjaśnienie powiązanego pytania

W pytaniu, które łączysz z pytającym, próbujesz przenieść plik do katalogu nadrzędnego, ..ale kończy się zmiana nazwy ..., pliki zaczynające się od kropki są domyślnie ukryte, dlatego nie mogą go znaleźć.

Podczas korzystania z mv w formularzu mv a b

  • Jeśli się do .niego przeprowadzisz, jest to w zasadzie operacja bez operacji, ale mvtraktuje to jako błąd.
  • Jeśli się do ..niego przeniesiesz, plik zostanie przeniesiony do katalogu nadrzędnego.
ctrl-alt-delor
źródło
1
Co masz na myśli If you move to . it is effectively a no operation? To nie jest „brak op”, to błąd, gdy próbujesz przenieść plik z A do B, gdy A i B są tym samym. Bardziej praktyczną demonstracją tego błędu jest mv foo ../some_dir/foolub mv foo some_subdir/../foo.
Brandin,
7
W przypadku niektórych definicji „znaku” NUL (0x00) jest również ograniczony do używania w nazwach plików i katalogów.
user117529,
1
Rozróżnienie między znakiem zastrzeżonym (tj. /I NUL) a zastrzeżoną nazwą (tj. .I ..) można by uczynić jaśniejszym. Warto również zauważyć, że .na początku nazwa ma specjalne znaczenie tylko w warstwie aplikacji, a nie w interfejsie API jądra lub wywołania systemowego.
kasperd
Myślę, że twoja przestrzeń się zagubiła.
nyuszika7h,
1
..i . wyjątkowe: nie można ich przenosić ani usuwać. Ale nie są one wyjątkowe przy przenoszeniu do nich plików .
reinierpost
52

Nie można zmienić nazwy pliku na .lub ..ponieważ wszystkie katalogi zawierają już wpisy dla tych dwóch nazw. (Te wpisy wskazują na katalogi i nie można zmienić nazwy pliku na katalog.)

mv wykrywa przypadek, w którym miejscem docelowym jest istniejący katalog i interpretuje go jako żądanie przeniesienia pliku do tego katalogu (przy użyciu jego bieżącej nazwy).

Odwrotne ukośniki nie mają z tym nic wspólnego, ponieważ .nie jest metaznakiem powłoki. \.i .są takie same bash.

cjm
źródło
9

Problem polega na tym, że przenosisz plik do katalogu. To może zawieść.

Powiem ci, jak to było kiedyś.

mkdir w zasadzie to czytał (kiedy piszę to w sh, tak naprawdę napisano w C i setuid-root).

mknod d $1
ln -d $1 $1/.
ln -d `dirname $1` $1/..

Jak widać, nie ma w tym nic specjalnego. i .. z wyjątkiem faktu, że zostały one dla Ciebie stworzone przez mkdir i już istnieją. Jest teraz kod, który mówi, że nie można ich usunąć, ale nie zawsze tak było.

rmdir wyglądał tak:

rm -d $1/..
rm -d $1/.
rm -d $1
Joshua
źródło
+1 za lekcję historii i dodanie czegoś, co nie zostało odpowiednio uwzględnione.
ctrl-alt-delor