从两个方向遍历文件列表

时间:2018-09-07 18:03:46

标签: linux bash loops rsync

我有以下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中执行类似操作?

1 个答案:

答案 0 :(得分:0)

您可以在&中使用bashfork一个进程。甚至循环。 我相信有多种方法可以实现这一目标,但这是一种方法。

伪代码。

以两个单独的数组获取文件列表,这样它们每个包含列表的一半(偶数)。
对于奇数文件,第二个数组将包含另一个文件。
遍历第一个数组并使用&派生一个进程
遍历第二个数组并使用&

派生第二个进程

代码

#!/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