bash scripting .. копирование файлов без перезаписи [закрыто]

Я хотел бы знать, возможно ли копировать / перемещать файлы в место назначения на основе имени источника.

По сути, у меня есть папка / mail, в которой есть несколько подпапок, таких как cur, new и т. Д. Затем у меня есть извлеченная резервная копия в / mail / home / username, которая является дубликатом. mv -f не будет работать, так как у меня нет разрешения перезаписывать каталоги, а только файлы внутри.

Я получаю ошибки, такие как mv: не могу перезаписать каталог `/home/username/mail/username.com '

Что я хочу сделать, так это для каждого файла в каталоге username.com переместить его в папку с таким же именем в / mail. Вместо username.com может быть любое количество папок с отдельными подкаталогами.

Каков наилучший способ сделать это?

Я должен сделать это таким образом, поскольку из-за обстоятельств у меня есть доступ к моему хосту только с помощью ftp и bash через php.

редактировать: уточнение

Я думаю, что мне нужно уточнить, что случилось. Я на общем хосте и, по-видимому, не имею права записи в сами каталоги. По крайней мере, основные из них, такие как mail и public_html. Я сделал резервную копию ~ / mail с помощью tar, но при попытке извлечь его распаковал в ~ / mail / home / mail и т. Д., Так как я забыл о полном пути. Теперь я не могу просто распаковать, потому что путь неправильный, и я не могу mv -f, потому что у меня есть доступ на запись только к файлам, а не к каталогам.

12.12.2008 16:14:45
6 ОТВЕТОВ
РЕШЕНИЕ

Для копирования вы должны рассмотреть возможность использования cpioв режиме 'pass' ( -p):

cd /mail; find . -type f | cpio -pvdmB /home/username/mail

Это -vдля многословного; -dсоздает каталоги по мере необходимости; -mсохраняет время модификации файлов; -Bозначает использовать больший размер блока, и здесь может быть неактуально (раньше это имело значение при работе с ленточными устройствами). Из этого списка пропущен -uфлаг, который выполняет безусловное копирование, перезаписывая ранее существующие файлы в целевой области. Команда cdгарантирует, что имена путей правильны; если вы только что сделали:

find /mail -type f | cpio -pvdmB /home/username

вы получите тот же результат, но только по стечению обстоятельств - потому что подкаталог в /home/usernameтом же каталоге, что и абсолютный путь к оригиналу. Если вам нужно было сделать:

find /var/spool/mail -type f | cpio -pvdmB /home/username/mail

тогда скопированные файлы будут найдены в разделе /home/username/mail/var/spool/mail, что вряд ли соответствует вашим ожиданиям.

Вы можете добиться аналогичного эффекта с помощью (GNU) tar:

(cd /mail; tar -cf - . ) | (cd /home/username/mail; tar -xf - )

Это копирует каталоги, а не только файлы. Для этого вам нужны средства только для GNU:

(cd /mail; find . -type f | tar -cf - -F - ) | (cd /home/username/mail; tar -xf - )

Первый сольный тире означает «запись в стандартный вывод»; второе означает «читать со стандартного ввода»; опция «-F» означает «прочитать имена файлов для копирования из названного файла».

2
12.12.2008 16:38:01

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

for file in /mail/*; do
    mv -f $file /home/username/mail/$(basename $file)
done

Это переместит каждый файл и подкаталог в / mail оттуда в / home / username / mail.

0
12.12.2008 16:24:30
Я думаю, что это обратное тому, что я хочу сделать? Я извлек почтовый архив в почтовую папку, но он создал подкаталог под почтой, который теперь не могу восстановить, потому что я не могу перезаписать исходные каталоги
user1253538 12.12.2008 16:29:38

Используете tarли вы опцию? Вы можете tarсоздать каталог и извлечь его /mail/(поскольку я предполагаю, что это именно то, что вам нужно), tarперезаписав существующие файлы и каталоги.

0
12.12.2008 16:39:00
Вот что я пробовал, проблема в том, что я могу перезаписывать только файлы, а не каталоги
user1253538 12.12.2008 16:44:21

Я немного озадачен тем, что именно вы хотите сделать. Но вы должны быть в состоянии использовать подход решения Адама и перенаправить ошибки в файл.

for file in /mail/*; do
    mv -f $file /home/username/mail/$(basename $file) 2> /tmp/mailbackup.username.errors
done

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

0
12.12.2008 16:40:01
Проблема в том, что я не могу перезаписать каталоги, только файлы, и мой почтовый архив в настоящее время находится в подкаталоге почты. восстановление кажется невозможным с помощью обычных инструментов.
user1253538 12.12.2008 16:45:19
Да, но я думаю, что если вы попробуете что-то вроде того, что я предлагаю, вы переместите все файлы, и любые сообщения об ошибках из-за возможности перезаписи каталогов npt будут перенаправлены в файл журнала.
PEZ 13.12.2008 07:35:37

Вы можете распаковать его снова? Параметр -P для tar не будет убирать начальный символ "/", поэтому будут учитываться абсолютные имена путей. От вашего редактирования, это звучит так, как будто это все исправит.

0
12.12.2008 16:58:22
Я пытался это, он выдает ошибку: tar: / home / username / mail: не найден в архиве после попытки с tar xzvfP ~ / new / moremail.tgz ~ / mail
user1253538 12.12.2008 17:16:16
Э-э, это означает, что вы хотите извлечь только элемент "~ / mail" из архива.
Nietzche-jou 12.12.2008 18:10:01
Я использовал -P в корневом каталоге, а / mail также в корневом каталоге. Он просто распаковал папку / home / username / mail, я не могу заставить его извлечь только почтовую папку ..
user1253538 15.12.2008 09:57:12

Даже с вашими разъяснениями у меня все еще есть проблемы с пониманием того, что вы делаете. Тем не менее, есть ли шанс, что вы можете использовать rsync? Хосты src и dest могут быть одним и тем же хостом для rsync. Насколько я помню, вы можете сказать rsync только обновлять файлы, которые уже существуют в целевой области (--existing), а также игнорировать изменения каталога (--omit-dir-times).

Опять же, я не совсем понимаю ваши потребности здесь, но rsync очень гибок в резервном копировании файлов и каталогов.

Удачи.

0
12.12.2008 17:04:31
Ааа, я вижу, у вас есть доступ только к ftp и bash. Ну, ладно, ладно.
shank 12.12.2008 17:06:45