У меня есть тонна файлов и каталогов в подкаталоге, который я хочу переместить в родительский каталог. В целевом каталоге уже есть несколько файлов и каталогов, которые необходимо перезаписать. Файлы, которые присутствуют только в цели, должны быть оставлены нетронутыми. Могу ли я заставить mv
это сделать? ( mv * ..
) Жалуется
mv: cannot move `xyz' to `../xyz': Directory not empty
Что мне не хватает?
shell
command-line
rename
EricSchaefer
источник
источник
mv -f
?mv -f
не правильный ответ.Ответы:
Вам нужно будет скопировать их в место назначения, а затем удалить источник, используя команды,
cp -r * ..
сопровождаемыеrm -rf *
.Я не думаю, что вы можете "объединить" каталоги, используя
mv
.источник
mv
быстрее, потому что вы находитесь на той же файловой системе? Что если вы используетеcp -l
для создания жестких ссылок, а не для перемещения файлов?cp -a
вместоcp -r
того, чтобы сохранить атрибуты файла (метка времени, разрешения и т. Д.).cp -rl source destination && rm -r source
.rsync
вероятно, будет лучшим вариантом здесь. Это так же просто, какrsync -a subdir/ ./
.Мое тестовое дерево в
filename
:contents
format:Бег
rsync
:дает:
И затем, чтобы эмулировать
mv
, вы, вероятно, хотите удалить исходный каталог:Предоставление:
Если это не так, можете ли вы привести аналогичный пример (например, используя мое тестовое дерево в верхней части этого ответа) с желаемым результатом?
источник
rm -r
в конце, чтобы сделать его в основном так же, какmv
.mv
является атомарным, сохраняет номера инодов (так что файл может оставаться открытым) и не требует времени и пространства при создании копии.cp -r; rm -r
. Я думаю, что в этом смыслеrsync
стоит упомянуть тоже.rsync
Можно удалить источник после копирования с--remove-source-files
параметром. Это должен быть удобный способ сделать то, что вы хотите.Из
rsync man page
:источник
cp -r; rm
из-за недостатка свободного места. Вместо этогоrsync --remove-source-files
оба минимизировали используемое дисковое пространство, избегая копировать одни и те же файлы.Вы можете сделать это с помощью
cp
иrm
, но без копирования огромного количества данных, которые вы (предположительно) пытаетесь избежать передачи. @mattdm упомянул об этом в своем комментарии , и ответ на другой вопрос содержит более полное обсуждение различных вариантов.По сути,
-l
опция дляcp
команды создает жесткие ссылки на файлы, а не копирует их данные в новые файлы.источник
cp -al source destination
чтобы сохранить информацию о владельце и разрешения.cp
перезаписывает по умолчанию.-f
Опция пытается удалить файл (как вrm
) , прежде чем пытаться скопировать заново, что может помочь , если процесс не может открыть файл для записи, хотя некоторые люди предпочли бы видеть , что произошла ошибка , вместо этого. Я не знаю, имело ли это значение для ОП, но я-f
все равно добавил флаг к своему ответу.Вот скрипт, который перемещает файлы из-под
/path/to/source/root
соответствующего пути в/path/to/destination/root
.Осторожно, непроверенный код.
источник
\;
перед-o
первой строкойfind
команды, и вы не должны убегать!
вif
- это просто!
, а не\!
Эта тема существует уже много лет и по-прежнему занимает первое место в Google, поэтому я хотел добавить еще один метод. Как я обычно это делаю: упаковываю содержимое subdir в tarball, перемещаем tarball в родительский каталог и затем извлекаю его с поведением по умолчанию --overwrite Это именно то, что вы ищете. После этого вы можете удалить свой subdir.
источник
Если у вас достаточно памяти, вы можете сделать это следующим образом:
Убедитесь, что нет важных файлов с ~ в конце, но если они есть, вы можете добавить их
--suffix=whateveryouwant
вместо стандартных.источник