Как вы запускаете последовательность команд в командном инструменте?

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

Поэтому я копирую несколько папок с сервера A на сервер B, но команда для каждого процесса копирования («rsync») должна выполняться из командной строки, как только для каждой папки.

Итак, чтобы скопировать папку A на сервер X, я выполняю команду rsync, и после ее копирования я выполняю новую команду rsync для копирования через папку B на сервер X.

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

Обычно несколько команд разделяются на одну строку ; точки с запятой или && амперсанды. Разница заключается в том, что если первая / предыдущая команда терпит неудачу с точкой с запятой, она продолжается. Если команда вызывает ошибку, и вы использовали амперсанды, то она остановится.

Таким образом, я использовал точки с запятой в моем процессе и позволял компьютеру работать на ночь … но он выполнил только первую команду, хотя я написал несколько строк на одной строке, разделенных точкой с запятой. Поэтому он должен был выполнить все из них один за другим … Итак, сначала: как правильно выполнить несколько команд и B, что не так с моей командой?

 sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-02-233653/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ; sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-09-152837/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ; sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-20-201229/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ; sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-02-21-130931/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ; sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-05-113353/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ; sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-19-162703/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ; sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-05-13-215016/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ; sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-06-01-231321/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 

Я разделил их на перерывы здесь для удобства чтения. Обычно это одна целая линия

Обычно это происходит с помощью a ; символ с запятой

3 Solutions collect form web for “Как вы запускаете последовательность команд в командном инструменте?”

Для повторяемости я предлагаю поместить строки в небольшой скрипт, но без ключевого слова sudo :

 #!/bin/bash rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-02-233653/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-09-152837/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-20-201229/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-02-21-130931/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-05-113353/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-19-162703/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-05-13-215016/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-06-01-231321/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 

Чтобы запустить серию команд, введите:

 chmod +x myscript.sh sudo ./myscript.sh 

Таким образом, sudo не синхронизируется во время длинной команды. Нет необходимости использовать точку с запятой в файле сценария. По умолчанию каждая строка может выйти из строя, а следующая выполняется (для ее изменения используйте set -o errexit ).

Я также заметил что-то подозрительное в ваших командах. для опции --progress вы не использовали обычный дефис , но какой-то другой, похожий на вид персонаж. Это может быть еще одним источником ошибок, которые вы видите.

Обратите внимание, что использование rsync – это rsync [OPTION]... SRC [SRC]... DEST что означает, что это можно более просто написать как

  rsync -r -t -h /src1dir /src2 /src3 /destdir 

который не подлежит таймаутам sudo session. Вы не спросили, но вариант -a гораздо более всеобъемлющий, чем -r -t .

Есть много способов сделать это. Подход, который вы пробовали, работал бы отлично, если бы каждый sudo не требовал ввода пароля. Так как это так, команды будут висеть с тех пор, как второй попросит пароль, и вы не были там, чтобы дать его. Поэтому вам нужен способ запускать все с помощью одного sudo вызова. Вот несколько способов сделать это.

  1. Напишите команды в скрипте и запустите скрипт с помощью sudo как описано в ответе @ Себастьяна.

  2. Запустите один rsync дающий несколько исходных папок, как это было предложено @msw.

  3. Стройте команды динамически. Похоже, вы хотите скопировать все папки SSDaeffer в /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap . Это означает, что вы можете просто написать

     sudo rsync -vah /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/*/SSDaeffer \ /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 

    Это скопирует все папки SSDaeffer которые являются подпапками каталога в /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS в /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap . Это предполагает, что вы хотите, чтобы все папки SSDaeffer там. Если вам нужны только некоторые из них, вы можете перечислить их в файле:

     $ cat file 2014-01-02-233653 2014-01-09-152837 2014-01-20-201229 2014-02-21-130931 

    Затем прочитайте файл, чтобы получить нужные имена:

     sudo while read dir; do rsync -vah /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/$dir/SSDaeffer \ /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap; done < file 

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

     while IFS= read -r dir; do rsync -vah /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/$dir/SSDaeffer \ /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap; done < file 
  4. Запустите корневую оболочку с помощью sudo -i . Это позволит вам войти в систему как суперпользователь, а затем вы можете запускать команды в своем сердце:

     $ sudo -i Password: # rsync -avh /from/dir1 /to/dir # rsync -avh /from/dir2 /to/dir # rsync -avh /from/dir3 /to/dir 
  • Выполнять удаленные команды, полностью отсоединяясь от ssh-соединения
  • Как автоматизировать загрузку последнего файла, загруженного в папку Google Диска?
  • Сценарий, который удаляет лишние пробелы между буквами в тексте
  • Использование EXIFTool для добавления EXIF-данных из имен файлов
  • Конкатенация содержимого файла И имен
  • Выполнить удаленный сценарий с локальным значением параметра
  • Privoxy: блокировка твиттера, facebook и google вне их доменовlr
  • Сортировка однозначно из строки
  • Как скриптировать эту функцию массового переименования?
  • Добавить информацию из .dat в CSV-файл
  • Возможно ли выполнить сценарий VIM в неинтерактивном режиме?
  • Linux и Unix - лучшая ОС в мире.