Я просто хочу переместить и перезаписать все файлы и папки, включая все подкаталоги и их файлы, в другую папку и ее подпапки.
Я попробовал следующие команды, но они не работают с подкаталогом и его файлами.
mv -f fromA/* toB/
mv -f fromA/{,.}* toB/
Таким образом, все файлы из папки A перемещаются в папку B, но не из A/sub в B/sub.
Я получаю сообщение об ошибке «Невозможно переместить 'fromA/subA' в 'toB/subB'»: Файл существует
Это работает, если я прохожу по каждой папке по одной, но я уверен, что я что-то упускаю. Я видел большинство, если не все, связанных ответов, но ни один из них не работает здесь.
решение1
info mv
есть это:
_Note_: 'mv' will only replace empty directories in the destination.
Conflicting populated directories are skipped with a diagnostic.
Похоже, что нет возможности отменить это. Либо удалите B и переименуйте A (обратно в B), либо сначала вручную очистите/удалите каталоги в B.
решение2
Я рекомендую использоватьrsync
С помощью rsync вы можете указать, какие файлы вы хотите удалить, и даже выполнить «пробный запуск», чтобы увидеть, что произойдет, если вы запустите его по-настоящему.
Пытаться
rsync -av --dry-run --delete-before fromA toB
--delete-before отлично подходит для слияния файлов в системах с небольшим количеством места. Если вас устраивает пробный запуск, удалите эту --dry-run
опцию.
Я рекомендую просмотреть страницу руководства, чтобы увидеть все возможные варианты «удаления», и решить, какой из них подойдет вам лучше всего.
Если вы хотите удалить все файлы в месте назначения, которые не связаны с перемещением, вы можете использовать опцию --delete-excluded
. Опять же, используйте --dry-run
для проверки того, что будет удалено, перед запуском.
Есть , --remove-source-files
который удалит исходные файлы во время передачи (как mv), но он не удаляет каталоги. Так что вам все равно придется удалить исходные каталоги с помощьюrm
решение3
На основании вашего утверждения, что вы получаете ошибку, что файл уже существует, у вас уже есть папки и файлы в 'toB'? Если вы в основном хотите объединить файлы из 'fromA' в 'toB', то вам, вероятно, лучше всего просто скопировать файлы рекурсивно (cp -ar), а затем удалить 'fromA'.
В противном случае, если «toB» изначально должен быть пустым и вы просто хотите убедиться, что содержимое «toB» совпадает с «fromA»:
$ rm -rf toB
$ mv fromA toB