Я пытаюсь написать сценарий Bash, который будет rsync только определенное подмножество папок. Я пытаюсь выяснить более гладкий, чтобы я мог просто добавить переменные, такие как FOLDER1='name of folder in home directory' а затем

rsync -arvz --delete /home/emka/$FOLDER1/ /home/emka/Desktop/Mount/$FOLDER1

В настоящее время у меня есть FOLDER1 FOLDER13 , но я не хочу, чтобы указанная выше строка тринадцать раз.

Может ли кто-нибудь дать мне толчок, как это сделать?

4 ответа4

3

Bash позволяет использовать массивы и циклы.

Определите каждый путь как элемент массива, затем выполните цикл по массиву.

1

Некоторые люди здесь, кажется, не правильно прочитали исходный вопрос, но, как один из них предложил: вы можете (и должны) использовать массивы. Если у вас действительно есть имена папок, хранящиеся в переменных FOLDER1 , FOLDER2 и т.д., И вы хотите сохранить их таким образом, вы можете использовать следующее:

for i in {1..13}; do
   eval "FOLDER=\$FOLDER$i"
   rsync -arvz --delete "/home/emka/$FOLDER/" "/home/emka/Desktop/Mount/$FOLDER"
done

Использование кавычек является хорошей привычкой, и в этом случае они обязательны, поскольку в именах каталогов есть пробелы.

0

Bash 3.0+ поддерживает массивы диапазонов.

for i in {1..13}
do
    rsync -arvz --delete /home/emka/FOLDER${i}/ /home/emka/Desktop/Mount/FOLDER${i}
done
0

Используя расширение Bash Brace, вы можете просто сделать это:

rsync -arvz --delete /home/emka/$FOLDER{1..13} /home/emka/Desktop/Mount/

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

cd /home/emka
rsync -arvz --delete ${folderarray[@]} /home/emka/Desktop/Mount/

Поставьте "echo" в начале этой строки, чтобы увидеть, что он собирается делать перед первым использованием :-)

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