У меня есть сценарий оболочки, который развертывает приложение на промежуточном сервере. Однако после развертывания необходимо создать резервную копию и восстановить один каталог приложения (чтобы он не перезаписывался). Мне удается сделать резервную копию каталога, но часть восстановления работает не так, как ожидалось. В основном, вот две строки в сценарии оболочки:

...
# backup user avatars
mv vitex/app/modules/users/pub/img/users/ ~/tmp/img-users.BAK/ &> /dev/null

...
# restore user avatars
mv ~/tmp/img-users.BAK/ vitex/app/modules/users/pub/img/users/ &> /dev/null

Проблема в том, что первая команда создает правильную папку в ~/tmp/ , а вторая команда создает vitex/app/modules/users/pub/img/users/img-users.BAK/ , что не хорошо.

Ожидаемое поведение будет таким img-users.BAK переместит все файлы назад, перезаписав все файлы в папке назначения, оставив все остальные файлы без изменений.

Как это может быть сделано?

Спасибо!

Примечание: рекурсивность не требуется, так как по этому пути нет каталога.

** Редактировать **

Шаг 1: резервный каталог

До

./vitex/app/modules/users/pub/img/
  ./users/
    ./1.png
    ./14.png
    ./README
    ...
./tmp/
  <empty>

После

./vitex/app/modules/users/pub/img/
   <empty>
 ./tmp/
   ./img-users.BAK/
    ./1.png
    ./14.png
    ./README
    ...

Все как и ожидалось.

Шаг 2: Восстановить каталог

До

./vitex/app/modules/users/pub/img/
  ./users/
    ./1.png
    ./3.png
    ./README
    ...
./tmp/
  ./img-users.BAK/
    ./1.png
    ./14.png
    ./README
    ...

После (фактический)

./vitex/app/modules/users/pub/img/
  ./users/
    ./img-users.BAK/
      ./1.png
      ./14.png
      ./README
      ...
    ./3.png
    ./1.png
    ./README
    ...
./tmp/
  <empty>

После (ожидается)

./vitex/app/modules/users/pub/img/
  ./users/
    ./1.png        <-- overwritten
    ./14.png
    ./3.png
    ./README       <-- overwritten
    ...
./tmp/
  <empty>

3 ответа3

2

Команды, которые вы дали, делают абсолютно правильно, а именно, перемещение каталогов. Если вам нужно переместить или скопировать файлы в каталог img/users обратно, то сделайте это явно:

mv -f ~/tmp/img-users.BAK/* vitex/app/modules/users/pub/img/users/

Обратите внимание, что я включил -f который заставит перезаписывать без запроса. Быть осторожен. Кроме того, не уверен, почему вы хотите выбросить STDOUT, поэтому я тоже это не учел.

1

Разница в том, что в первом случае пункт назначения не существует, а во втором уже существует.

mv ~/tmp/img-users.BAK/ vitex/app/modules/users/pub/img/users/

Вторая команда перемещает все файлы, кроме последних, в последний каталог, поэтому вам нужно перечислить все файлы для перемещения. Вы можете сделать это с помощью globbing:

mv ~/tmp/img-users.BAK/* vitex/app/modules/users/pub/img/users/

В качестве (важного) примечания следует избегать иметь / в конце исходного каталога. У него могут быть очень странные побочные эффекты, и в любом случае он не очень полезен:

От pinfo mv:

**Warning**: Avoid specifying a source name with a trailing slash,
when it might be a symlink to a directory.  Otherwise, `mv' may do
something very surprising, since its behavior depends on the underlying
rename system call.  On a system with a modern Linux-based kernel, it
fails with `errno=ENOTDIR'.  However, on other systems (at least
FreeBSD 6.1 and Solaris 10) it silently renames not the symlink but
rather the directory referenced by the symlink. 
0

Если промежуточным этапом между резервным копированием и восстановлением является повторное создание каталога users (как это, кажется, имеет место), то для восстановления вам нужно либо переименовать отдельные файлы (как было показано в предыдущих ответах). хотя я бы сказал, что это может быть не то, что вам нужно), или, в сценарии restore , удалите каталог users перед тем, как переместить его обратно на место, так что backup останется прежним (за исключением того, что касается упомянутой проблемы конечного слэша) в ответ Фолькер Зигель:

...
# backup user avatars
mv vitex/app/modules/users/pub/img/users ~/tmp/img-users.BAK

Вы бы добавили команду для restore , например:

...
# restore user avatars
rm -rf vitex/app/modules/users/pub/img/users
mv ~/tmp/img-users.BAK vitex/app/modules/users/pub/img/users

Я также удалил перенаправление на /dev/null , потому что я думаю, что в типичном случае он вам не понадобится (mv будет молчать), тогда как если что-то странное продолжится, вы получите сообщения об ошибках, которые могут быть полезно выяснить, что случилось.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .