Я хочу переместить содержимое каталога в другой каталог с теми же папками.
Вот пример:
У меня есть ./backup
с каталогами base
и test
. Теперь я хочу переместить эти каталоги в ./backupArchives
.
Я использую это:
mv ./backup/* ./backupArchives
, но я получил ошибку
mv: cannot move './backup/base' to './backupsArchive/base': Directory not empty
Я пытался использовать --force
, но не повезло. Есть ли способ переместить его, когда папки уже существуют?
Примечание: я просто хочу объединить содержимое, перезаписи нет.
Прежде чем задать вопрос, давайте рассмотрим упрощенный случай.
Предположим, что в / home / admin у нас есть две папки foo
и bar
, которые имеют одинаковую структуру подкаталогов, но каждая содержит разные файлы. Теперь мы хотим объединить их в один. Когда мы делаем что-то вроде mv foo/* bar
, возникает ошибка mv: directory not empty
.
Мое решение - отказаться от инструментов командной строки и переключиться на файловый менеджер с графическим интерфейсом, например, dolphin. Когда вы переименовываете foo
в bar
в dolphin, он дает вам возможность записать в папку назначения и спрашивает вас, перезаписывать ли существующие файлы в интерактивном режиме. Это позволяет избежать копирования и удаления, что фактически экономит ваше время без единой строки кода.
PS: я не проверял каждый файловый менеджер там. Но большинство из них должны иметь эту функцию.
Быстро и грязно, если вы знаете, что делаете:
cp -r ./backup/* ./backupArchives && rm -R ./backup/*
Хотя его справочная страница не документирует это, mv
откажется переименовать каталог в другой каталог, если целевой каталог содержит файлы. В вашем случае это хорошо, потому что вы хотите объединить содержимое источника с целью, что mv
не сработает.
Используйте вместо этого rsync -a backup/ backupArchives/
. После этого rm -rf backup/*
.
Вместо использования rsync
, вы также можете сделать классический
(cd backup && tar c .) | (cd backupArchives && tar xf -)
, который зарабатывает вам больше очков выродка.
После перемещения каталога вам нужно *
(представляет любой текст или число). Например:
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/
Конечно, rsync
работает, но это может также работать на машине, которая не поддерживает rsync
(то есть в cpanel, которая по умолчанию не установлена).
Как насчет использования:
cd /path/to/backup/ && cp -R --parents ./* ../backupArchives
Затем, при необходимости, удалите каталог backup
Примечание 1: Вам необходимо cd
перейти в каталог backup
перед выполнением cp -R --parents ...
]
Примечание 2: Дважды проверьте каталог backupArchives
, если вы получили новые файлы из резервной копии.
При перемещении каталога во время выполнения скрипта необходимо учитывать несуществующие или пустые каталоги, а также принудительно переопределять и удалять подтверждение:
# 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