Итерация по списку файлов с двух направлений - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть следующий скрипт bash

#!/bin/bash 


for i in `ls /file-directory/ | grep -v static-backup | grep -v fileGroup1 | grep -v fileGroup2`
 do
 echo $i
 rsync --delete -avz --size-only --exclude "$i/stuff1" --exclude "$i/stuff2" --exclude "$i/stuff3" --exclude "$i/stuff4" --exclude "$i/stuff5" --exclude "$i/stuff6" /file-directory/$i otherServer:/file-directory/ && echo " exit code: " $?" $i" || echo " exit code: " $?" $i"
 done

Сценарий выполняет итерацию по каталогу файлов и выполняет rsyncs его подкаталогов, исключая определенные файловые группы и части каталогов этих файловых групп. Я хотел бы, чтобы этот скрипт порождал две задачи rsync, одна из которых начинается в верхней части каталога, а другая - в нижней. Они будут повторяться в противоположных направлениях и встречаться в середине.

Это относительно просто сделать с обычным счетом для циклов, и не будет слишком сложным в чем-то вроде Python (вы можете просто сохранить количество каталогов в виде переменной, а затем выполнить итерацию, используя эту переменную). Как я могу сделать что-то подобное в Bash?

1 Ответ

0 голосов
/ 08 сентября 2018

Вы можете использовать & в bash до fork процесса. или даже петля. Я уверен, что есть несколько способов достичь этого, но вот один из способов.

Псевдокод.

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

код

#!/bin/bash
dir_len=$(ls /file-directory/ |wc -l|awk '{print $NF}')
midpoint=$(($dir_len / 2))

array1=()
array2=()
count=0

#Loop through files and divide contents into two arrays  
for i in $(ls /file-directory/)
do
  count=$(($count + 1))
  if [ $count -le $midpoint ] ; then
    array1+=($i)
  elif [[ $count -gt $midpoint && $count -le $dir_len ]] ; then
    array2+=($i)
  fi
done

#Loop through first array and fork     
for i in "${array1[@]}"
do
  echo $i
  #your rsync command here
done&

#Loop through second array and fork
for j in "${array2[@]}"
do
  echo $j
  #your rsync command here
done &  

Примечание:
& необязательно в секунду для цикла for, так как вы можете запустить его на переднем плане, так как есть только два процесса.
Кроме того, вы можете захотеть укрепить скрипт для нежелательных файлов или если папка пуста.

Edit.

В зависимости от типа файлов, которые вам нужно rsync, используйте эту ссылку для вдохновения, а не ‘ls / folder_name /‘.

https://unix.stackexchange.com/questions/9496/looping-through-files-with-spaces-in-the-names

...