我有以下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
该脚本遍历文件目录并rsync其子目录,但不包括某些fileGroup和这些文件组目录的某些部分。我希望此脚本产生两个rsync作业,一个从目录的顶部开始,另一个从底部开始。他们将朝相反的方向迭代,并在中间相遇。
这对于正常的循环计数来说是相对简单的,并且不会像python那样费力(您可以将目录数保存为变量,然后使用该var进行迭代)。如何在bash中执行类似操作?
答案 0 :(得分:0)
您可以在&
中使用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循环中是可选的,因为您可以在前台运行它,因为只有两个进程。
另外,您可能需要加强脚本以获取不需要的文件或文件夹为空。
编辑。
根据您需要rsync的文件类型,请参考此链接以获取灵感,而不要使用“ ls / folder_name /”。
https://unix.stackexchange.com/questions/9496/looping-through-files-with-spaces-in-the-names