Ta odpowiedź pokazuje, że można skopiować wszystkie pliki - w tym ukryte - z katalogu src
do katalogu w następujący dest
sposób:
mkdir dest
cp -r src/. dest
W odpowiedzi ani w komentarzach nie ma wyjaśnienia, dlaczego tak naprawdę działa, i nikt nie wydaje się na to znaleźć dokumentacji.
Wypróbowałem kilka rzeczy. Po pierwsze, normalny przypadek:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file src
Następnie /.
na końcu:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file .dotfile src_dir src_file
Zachowuje się to podobnie *
, ale także kopiuje ukryte pliki.
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest
$ ls -A dest
dest_file src_dir src_file
.
i ..
są odpowiednimi linkami, jak wyjaśniono tutaj , podobnie jak sam wpis katalogu.
Skąd się bierze to zachowanie i gdzie jest to udokumentowane?
cp
Odniesienia wyraźnie wyjaśnia, jakcp -R
działa..
i..
są katalogami, tak jak wszystkie inne katalogi, nie ma w nich nic magicznego lub tajemniczego..
i..
nie zachowuj się jak inne katalogi.Odpowiedzi:
Zachowanie jest logicznym wynikiem udokumentowanego algorytmu dla
cp -R
. Patrz POSIX , krok 2f:.
i..
są katalogami, odpowiednio bieżącym i nadrzędnym. Żadne z nich nie jest wyjątkowe, jeśli chodzi o powłokę, więc żadne z nich nie dotyczy rozszerzenia, a katalog zostanie skopiowany wraz z ukrytymi plikami.*
, z drugiej strony, zostanie rozwinięty do listy plików, i tutaj filtrowane są ukryte pliki.src/.
jest bieżącym katalogiem wewnątrzsrc
, który jestsrc
sam;src/src_dir/..
tosrc_dir
katalog nadrzędny, który również jestsrc
. Więc z zewnątrzsrc
, jeślisrc
jest katalogiem, określeniesrc/.
lubsrc/src_dir/..
jako plik źródłowycp
są równoważne, i skopiuj zawartośćsrc
, w tym ukryte pliki.Chodzi o
src/.
to, że zakończy się niepowodzeniem, jeślisrc
nie jest katalogiem (lub dowiązaniem symbolicznym do katalogu), podczas gdysrc
nie. Skopiuje równieżsrc
tylko zawartość , bez kopiowaniasrc
; odpowiada to również dokumentacji:Więc
cp -R src/. dest
kopiuje zawartośćsrc
dodest/.
(plik źródłowy jest.
wsrc
), podczas gdycp -R src dest
kopiuje zawartośćsrc
dodest/src
(plik źródłowy jestsrc
).Innym sposobem myślenia o tym jest porównanie kopiowania
src/src_dir
isrc/.
zamiast porównywaniasrc/.
isrc
..
zachowuje się tak jaksrc_dir
w poprzednim przypadku.źródło
src
spowoduje skopiowanie katalogudest
,src/.
skopiowanie zawartości. Spróbuję to wyjaśnić w pytaniu.src/.
isrc/*
(uwaga, niesrc/.*
);src/*
nie zawiera ukrytych plików, jeśli globbing je zignoruje ...src
zawiera,src/.
ale oznacza to, że katalog zawierający katalog zależy od tego, jak go nazwiesz. Oczywiście istnienie.
łączy w pewnym sensie oznacza, że wszystkie katalogi zawierają siebie, ale może to nie być intuicyjne dla wszystkich. Zamiast tego zachowania można również pokusić się o założenie, że „katalog zawierający katalogfoo
” byłby określony przezfoo/..
, w którym to przypadku nie miałoby znaczenia, czy odnosimy się do :foo
lubfoo/.
wynikowy katalog zawierający byłby taki sam.foo
ifoo/.
wydaje się nieco delikatne, ale nie mam nic przeciwko, uważam to również za nieco zabawne.Po uruchomieniu
cp -R src/foo dest
dostanieszdest/foo
. Więc jeśli katalogdest/foo
nie istnieje,cp
utworzy go, a następnie skopiuje zawartośćsrc/foo
dodest/foo
.Po uruchomieniu
cp -R src/. dest
,cp
widzi, żedest/.
istnieje, i to jest to po prostu kwestia kopiując zawartośćsrc/.
dodest/.
.Kiedy myślisz o tym, jak kopiując katalog o nazwie
.
odsrc
i połączenie jej z istniejącą zawartość katalogudest/.
, to sensu.źródło