Możesz to zrobić za pomocą -T
opcji w cp
.
Zobacz stronę podręcznika dla cp
.
-T, --no-target-directory
treat DEST as a normal file
Tak więc, jak na twoim przykładzie, poniżej przedstawiono strukturę plików.
$ tree test
test
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Możesz zobaczyć wyraźną różnicę, gdy używasz funkcji -v
Verbose.
Kiedy używasz tylko -R
opcji.
$ cp -Rv foo/ bar/
`foo/' -> `bar/foo'
`foo/b' -> `bar/foo/b'
`foo/a' -> `bar/foo/a'
$ tree
|-- bar
| |-- a
| |-- b
| `-- foo
| |-- a
| `-- b
`-- foo
|-- a
`-- b
3 directories, 6 files
Kiedy używasz tej opcji -T
, nadpisuje zawartość, traktując miejsce docelowe jak zwykły plik, a nie katalog .
$ cp -TRv foo/ bar/
`foo/b' -> `bar/b'
`foo/a' -> `bar/a'
$ tree
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
To powinno rozwiązać twój problem.
bar/
), ale nie w źródle (foo/
), zostaną pozostawione na miejscu, więc większość ludzi nie uważa tego za całkowite nadpisanie katalogu. to znaczy. gdybybar/baz
już istniał, nadal istniałby później ...rm -rf bar/* && cp -TRv foo/ bar/
Zrób to w dwóch krokach.
źródło
bar
identyczną zawartośćfoo
, a nie kombinację elementów zfoo
i innych elementów, które mogły już istnieć wbar
. Bardzo pozytywna odpowiedź od @Saurabh Meshram poniżej przedstawia ten problem.rm -rf bar/; cp -r foo/ !$
foo
ibar
to duże katalogi ... może są plikibar
, które nie są wfoo
to, że nie chcą, aby usunąć. Nie należy tego uważać za realistyczną odpowiedź imhoJeśli chcesz mieć pewność, że
bar/
kończy się identyczniefoo/
, użyjrsync
zamiast tego:Jeśli zmieniło się tylko kilka rzeczy, będzie to działać znacznie szybciej niż usuwanie i ponowne kopiowanie całego katalogu.
-a
jest „trybem archiwum”, który wiernie kopiuje plikifoo/
dobar/
--delete
usuwa niektóre pliki niefoo/
zbar/
tak dobrze, zapewniającbar/
kończy się identyczne-vh
aby były szczegółowe i czytelne dla człowiekafoo
jest wymagane, w przeciwnym raziersync
zostanie skopiowanafoo/
dobar/foo/
zamiast nadpisywaniabar/
siebie.foo/
na treśćbar/
, mamy użyj ukośnika na obu. Jest to mylące, ponieważ nie będzie działać zgodnie z oczekiwaniami z ukośnikiem na żadnym z nich ; rsync podstępnie zawsze interpretuje ścieżkę docelową tak, jakby miała ukośnik, mimo że honoruje brak ukośnika w źródle ścieżka. Więc musimy ukośnik na ścieżce źródłowej, aby dopasować automatycznie dodany ukośnik na ścieżce docelowej, jeśli chcemy, aby skopiować zawartość zfoo/
dobar/
, zamiast katalogufoo/
ląduje wbar/
jakbar/foo
.)rsync
jest bardzo potężny i przydatny, jeśli jesteś ciekawy, co jeszcze może zrobić (na przykład kopiowanie przez ssh).źródło
cp -T
opcja, bo działa też na macosx 👍Użyj tego
cp
polecenia:źródło
cp
polecenie powinno usuwać plik ze źródła?Następujące polecenie zapewnia, że dotfiles (pliki ukryte) są uwzględnione w kopii:
źródło
.
oznacza wszystkie pliki w katalogu. Więc oczywiście ukryte pliki zostaną uwzględnione.Bardzo podobny do @Jonathan Wheeler:
Jeśli nie chcesz pamiętać, ale nie przepisujesz
bar
:!$
wyświetla ostatni argument poprzedniego polecenia.źródło
to powinno rozwiązać twój problem.
źródło
Zdefiniowana operacja to „scalanie” i nie możesz tego zrobić
cp
. Jeśli jednak nie chcesz scalać i zgubić folderbar
, możesz po prosturm -rf bar
usunąć folder, a następniemv foo bar
zmienić jego nazwę. Nie zajmie to czasu, ponieważ obie operacje są wykonywane przez wskaźniki plików, a nie zawartość pliku.źródło
Spróbuj użyć tego złożonego z dwóch kroków polecenia:
źródło