mv: каталог не пустой

155

Я хочу переместить содержимое каталога в другой каталог с теми же папками.

Вот пример:

У меня ./backupесть каталоги baseи test. Теперь я хочу переместить эти каталоги в ./backupArchives.

Я использую это:

mv ./backup/* ./backupArchives

но я получил ошибку

mv: cannot move './backup/base' to './backupsArchive/base': Directory not empty

Я пытался использовать --force, но не повезло. Есть ли способ переместить его, когда папки уже существуют?

Примечание: я просто хочу объединить содержимое, нет перезаписи.

UdK
источник
Вы просто пытаетесь объединить содержимое папок с пунктом назначения или пытаетесь перезаписать содержимое пункта назначения. (это также помогает, если у вас есть ВСЯ ошибка, без использования ...... для усечения данных)
Thomas Ward
Я просто хочу объединить содержимое, нет перезаписи.
UdK
2
@UdK Даже если это сработает, обратите внимание, что это не объединит содержимое двух каталогов. Перемещение каталога заменит его цель. Взгляните rsyncвместо этого, это сделает слияние.
zwets

Ответы:

188

Хотя его mvсправочная страница не документирует его, она откажется переименовать каталог в другой каталог, если целевой каталог содержит файлы. Это хорошо в вашем случае, потому что вы хотите объединить контент источника с целью, что mvне сработает.

Используйте rsync -a backup/ backupArchives/вместо этого. После этого rm -rf backup/*.

Вместо того, чтобы использовать rsync, вы также можете сделать классический

(cd backup && tar c .) | (cd backupArchives && tar xf -)

который зарабатывает вам больше очков гиков.

zwets
источник
4
хорошие вещи, чтобы знать! Оба работают отлично. Спасибо!
UdK
5
Очки Geek - лучшие очки: D
MadMike
2
Следует отметить, что это требует, чтобы у вас был размер папки в свободном пространстве. И вызовет ужасные проблемы, если нет.
Погриндис
4
@Pogrindis Пожалуйста, объясните, какие ужасные проблемы возникнут и чем они отличаются от любых других попыток записи на полный диск? Действительно, поскольку обе операции сохраняют исходный каталог нетронутым, если операция завершается неудачей просто rm -rf backupArchivesбез последствий, не говоря уже о «ужасных».
zwets
4
Спасибо за наименование классического подхода, очень полезно, если rsync недоступен! Также работает с использованием sudosudo sh -c '(cd backup && tar c .) | (cd backupArchives && tar xf -)'
ArendE
39

Быстро и грязно, если вы знаете, что делаете:

cp -r ./backup/* ./backupArchives && rm -R ./backup/*
patrickvacek
источник
3
Также работает в моем безопасном режиме, гениально.
Banned_User
4

После того, как каталог вы перемещаете, вам нужно *(представляет любой текст или число). Например:

mv /var/www/* /recovery/wwwrecovery/

Вот и все, если вы перемещаете файлы, то вы двигаетесь как:

mv /var/www/index.php /recovery/index.php

Другой способ - упаковать содержимое этой папки с помощью tar:

tar -cvzpf backup.tar.gz /var/www 

Затем переместите его в любой другой файл. Также я рекомендую этот шаг, потому что tar сжимает его и делает его меньше по размеру.

Чтобы извлечь файлы в другую папку, используйте

tar -xvzpf /var/www/

Если вам нужно скопировать в местоположение, которое вам не принадлежит, обязательно добавьте команду к sudoкоманде после того, какой параметр вы решите использовать.

sudo tar -cvzpf backup.tar.gz /var/www/
Димитрис Теодоридис
источник
Я использую Ubuntu 12.10, и я получил: mv: неверный параметр - 'R' Попробуйте `mv --help 'для получения дополнительной информации. Действительно .tar хорош, но мне нужно знать, как переместить мои файлы для этой ситуации. Спасибо за вашу помощь
UdK
Я использую рабочий стол 12.04 и сервер, и в обоих работает хорошо. будьте осторожны, если вы не сделали пробел между Folfer и -R. я также пробовал без -R работает для меня таким же образом, попробуйте без -R, но будьте осторожны с написанием: linux имеет значение строчные и прописные буквы !!! чем если путь не движется или движется от места. если у вас нет той папки, которую вы хотите переместить, просто поместите -C после нее, и она создаст ее. также попробуйте сначала: найдите имя -iname вашей папки и выполните эту команду от пользователя root, просто чтобы увидеть, существует ли она в другом месте, если вы что-то пропустили. дайте мне точную команду, которую вы использовали
Димитрис Теодоридис
что даааа ..... поместите это имя между двумя **
Димитрис Теодоридис
1
Это, -Rконечно, не должно идти после первого аргумента. Параметры (почти) всегда предшествуют аргументам команды. Кроме того, mvне имеет -Rвозможности, и, наконец, рекурсия не имеет отношения к mv. @DimitrisTheodoridis, пожалуйста, сначала проверьте свой ответ.
zwets
да, мой брат, ты прав, у меня всегда есть проблемы с написанием, и всегда у меня проблемы с терминалом для этого, или команда не найдена, или создаю новые файлы и каталоги, которые я не знаю, только для базового написания ... кстати, я использовал команду cp, чем здесь написал mv sory для этого брата: D
Dimitris Theodoridis
4

Конечно rsync, работает, но это может также работать на машине, которая не поддерживает rsync(например, в cpanel, которая по умолчанию не установлена ​​rsync).

Как насчет использования:

cd /path/to/backup/ && cp -R --parents ./* ../backupArchives

Затем удалите backupкаталог, если это необходимо

Примечание 1: Вам необходимо cdперейти в backupкаталог перед выполнениемcp -R --parents ...

Примечание 2: Дважды проверьте backupArchivesкаталог, если вы получили новые файлы из резервной копии.

Атилло Регнер Рекс
источник
1

Прежде чем задать вопрос, давайте рассмотрим упрощенный случай.

Предположим , что в / главная / админ у нас есть две папки fooи barкоторые имеют ту же структуру подкаталогов, но каждый из которых содержит различные файлы в нем. Теперь мы хотим объединить их в один. Когда мы делаем что-то вроде mv foo/* bar, mv: directory not emptyвозникает ошибка .

Мое решение - отказаться от инструментов командной строки и переключиться на файловый менеджер с графическим интерфейсом, например, dolphin. При переименовании fooк barв дельфине, это дает вам возможность записывать в папку назначения, и спрашивает , нужно ли перезаписывать существующие файлы, в интерактивном режиме . Это позволяет избежать копирования и удаления, что фактически экономит ваше время без единой строки кода.

PS: я не проверял каждый файловый менеджер там. Но большинство из них должно иметь эту функцию.

navigaid
источник