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

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

Вот пример:

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

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

mv ./backup/* ./backupArchives

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

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

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

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

158
задан 20 April 2015 в 09:39

6 ответов

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

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

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

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

0
ответ дан 20 April 2015 в 09:39

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

cp -r ./backup/* ./backupArchives && rm -R ./backup/*
0
ответ дан 20 April 2015 в 09:39

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

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

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

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

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

0
ответ дан 20 April 2015 в 09:39

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

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/
0
ответ дан 20 April 2015 в 09:39

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

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

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

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

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

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

0
ответ дан 20 April 2015 в 09:39

При перемещении каталога во время выполнения скрипта необходимо учитывать несуществующие или пустые каталоги, а также принудительно переопределять и удалять подтверждение:

# If old directory exists, and isn't empty
if [[ -d old_dir ]] && [[ -n `ls -A old_dir` ]] ; then

  # Make a new directory (skip if already exists)
  mkdir -p new_dir

  # Copy all files to the new directory (-afr : Keep attributes, Force overwrite, Recursive copy)
  cp -afr old_dir/* new_dir/

  # Remove old directory
  rm -rf old_dir
fi
0
ответ дан 8 May 2020 в 11:48

Другие вопросы по тегам:

Похожие вопросы: