Вы можете сделать это, используя -T
опцию в cp
.
См. Страницу руководства для cp
.
-T, --no-target-directory
treat DEST as a normal file
Итак, согласно вашему примеру, ниже представлена файловая структура.
$ tree test
test
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Вы можете увидеть явную разницу при использовании -v
для Verbose.
Когда вы используете только -R
вариант.
$ 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
Когда вы используете эту опцию, -T
он перезаписывает содержимое, обрабатывая место назначения как обычный файл, а не каталог .
$ cp -TRv foo/ bar/
`foo/b' -> `bar/b'
`foo/a' -> `bar/a'
$ tree
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Это должно решить вашу проблему.
bar/
), но не в источнике (foo/
), будут оставлены на месте, поэтому большинство людей не сочли бы это полной перезаписью каталога. т.е. если бы онbar/baz
уже существовал, он все еще существовал бы после ...rm -rf bar/* && cp -TRv foo/ bar/
Сделайте это в два этапа.
источник
bar
он идентичен по содержаниюfoo
, а не комбинации элементов изfoo
плюс других элементов, которые, возможно, уже существовали вbar
. В ответе @Saurabh Meshram ниже, получившем высокую оценку, есть эта проблема.rm -rf bar/; cp -r foo/ !$
foo
иbar
являются большими каталогами ... может быть, в них есть файлыbar
,foo
которые вы не хотите удалять. Это не следует считать реалистичным ответом, imhoЕсли вы хотите, чтобы
bar/
концы были идентичныfoo/
, используйтеrsync
вместо этого:Если изменилось всего несколько вещей, это будет выполняться намного быстрее, чем удаление и повторное копирование всего каталога.
-a
является «архив режима», который копирует файлы точно вfoo/
кbar/
--delete
удаляет лишние файлы неfoo/
отbar/
а, обеспечивая вbar/
конечном итоге идентичные-vh
для подробного и удобочитаемогоfoo
требуется, в противном случаеrsync
будет копироватьfoo/
в ,bar/foo/
а не перезаписыватьbar/
себя.foo/
на содержаниеbar/
, мы используйте косую черту на обоих. Это сбивает с толку, потому что он не будет работать должным образом с косой чертой ни на одном из них ; rsync украдкой всегда интерпретирует путь назначения, как если бы у него есть косая черта, даже если он учитывает отсутствие косой черты в источнике путь. Таким образом , нам нужно слэш на пути источника, чтобы он соответствовал слэш автоопределение добавляемых на пути назначения, если мы хотим , чтобы скопировать содержимое изfoo/
вbar/
, а не из каталогаfoo/
сама посадка вbar/
какbar/foo
.)rsync
очень мощный и полезный, если вам интересно, посмотрите, что еще он может делать (например, копировать через ssh).источник
cp -T
вариант, потому что он также работает на macosx 👍Используйте эту
cp
команду:источник
cp
команда должна удалять файл из источника?Следующая команда обеспечивает включение в копию точечных файлов (скрытых файлов):
источник
.
означает все файлы в каталоге. Итак, естественно, будут включены скрытые файлы.Очень похоже на @Jonathan Wheeler:
Если не хотите запоминать, но не переписывать
bar
:!$
отображает последний аргумент вашей предыдущей команды.источник
это должно решить вашу проблему.
источник
Операция, которую вы определили, является «слиянием», и вы не можете этого сделать
cp
. Однако, если вы не ищете слияния и можете потерять папку,bar
вы можете простоrm -rf bar
удалить папку, а затемmv foo bar
переименовать ее. Это не займет много времени, поскольку обе операции выполняются указателями файлов, а не содержимым файла.источник
Попробуйте использовать эту команду, состоящую из двух шагов:
источник