Jak skopiować całą zawartość jednego katalogu do innego?
Na przykład:
$ cd /home/newuser
$ cp -a /backup/olduser/* .
Problem z powyższym polega na tym, że wzór globowania „*” pasuje do ukrytych katalogów ”. i „..”, a skończysz na katalogu „olduser” wewnątrz „newuser”, a także na zawartości.
Możesz także zrobić coś takiego:
$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser
Ale co jeśli newuser zawiera już jakieś domyślne pliki i katalogi?
Jaki jest najprostszy, najbardziej poprawny, najłatwiejszy do zapamiętania, a nie nieporządny sposób przenoszenia zawartości jednego katalogu do drugiego za pomocą prostej komendy „cp” i powłoki?
.
i jak..
działa. Chcesz to wyjaśnić?cp -r ./a b
nie. Masz pomysł, dlaczego?r
opcja nie jest potrzebna.a
Opcja zakładar
.Dwa katalogi a i b.
Oba mają pliki.
Jesteś w katalogu, który zawiera aib.
-r
= rekurencyjnie.źródło
cp
skopiować kataloga
ia/.somedotfile
jest on zawarty przeza
. jeślib
istnieje, to polecenie utworzy dokładną kopię plikua
atb/a
.cp -R /some/dir/* /another/dir
Pamiętaj też, że domyślnie cp kopiuje pierwszy katalog do drugiego katalogu, jeśli drugi istnieje. Na przykład
cp -a a b
skopiuje INTO b, jeśli istnieje b, tzn. Utworzy a do b.Jeśli nie jest to, czego chcesz i chcesz skopiować zawartość a do b (na przykład podczas kopiowania całego systemu plików do punktu montowania) użyj:
jak w poprzedniej odpowiedzi.
Należy również pamiętać, że
-a
obejmuje-r
to-ar
jest zbędne.źródło
/.
działaa/.
reprezentuje zawartość katalogu „a” w przeciwieństwie do samego katalogu, w większości przypadków jest synonimem, ale podczas używaniacp -r
unika domyślnego zachowania cp (kopiowanie INTO b).O ile poważnie nie zmieniłeś konfiguracji powłoki, wzór globowania „*” nie pasuje ”. lub „..”, ponieważ można to zweryfikować za pomocą echa *. Zamiast tego pomija pliki, których nazwa zaczyna się od „.”, Więc twoje podejście pominie wszystkie ukryte pliki. Możesz poprawić niektóre z tych zachowań za pomocą opcji powłoki, na przykład opcji dotglob w bash, ale wtedy nie będzie to przenośna i niezawodna opcja, której szukasz.
Jeśli musisz to zrobić więcej niż raz lub dwa razy, radzę zajrzeć do rsync lub unison (w zależności od konkretnych potrzeb) ze starannie spreparowanymi specyfikacjami źródłowymi i docelowymi.
Inną alternatywą jest umieszczenie katalogu źródłowego w archiwum tar i rozpakowanie go nad istniejącym katalogiem docelowym.
źródło
( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )
...tar cf - .
tar jest katalogiem źródłowym, zawiera pliki dotfiles i wypluwa go do STDOUT, który jest przesyłany do STDIN plikutar xf -
.Spowoduje to skopiowanie zarówno normalnych, jak i ukrytych plików, z wyłączeniem katalogu nadrzędnego (
..
):Jeśli nie wykluczysz katalogu nadrzędnego, skończysz z całą zawartością
..
katalogu docelowego.źródło
..
(np....
Lub..super-hidden
).Aby skopiować pliki zaczynające się od kropki, po prostu wykonaj cp. * Target /
Najłatwiej jest po prostu wykonać polecenie cp dwa razy.
Jak mówi Peter Eisentraut, normalne zasady globowania nie obejmują… i. (hm, jak zakończyć to zdanie?;)
Wystarczy użyć -r, aby uczynić go rekurencyjnym, i -i, aby polecenie cp zapytało, czy naprawdę chcesz zastąpić plik.
źródło
*
nie pasuje.
lub..
, ale tak jest, jeśli używasz.*
. Spróbowaćecho .*
. Można wykluczyć.
i..
z następującym wzorem:.[^.]*
..[^.]*
nadal wyklucza nazwy rozpoczynające się od..
(np....
lub..super-hidden
).Działa to w przypadku kopiowania wszystkich plików i katalogów z wyjątkiem ukrytych katalogów rekurencyjnie z bieżącego katalogu do dowolnego miejsca:
źródło