Вы можете использовать &
в 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