Linux 从两个方向遍历文件列表

Linux 从两个方向遍历文件列表,linux,bash,loops,rsync,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/s

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

您可以在
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/”


Bash有一个内置的“循环计数”。请参阅。
grep-v-ea-eb-ecc
的结果与
grep-va | grep-vb | grep-vc
的结果相同,但速度大约是前者的三倍,因为它只扫描输入一次,并且不需要生成三个子进程。此外,我认为您的目的是并行运行两个rsync进程。你应该看一看,而不是试着自己滚。
for i in$(ls/file directory/)
如果任何文件名在IFS或换行符中包含字符,就会中断。我同意,这不是一个全面的解决方案,而是一种开始的方法。OP可以参考此链接了解如何处理特殊文件。在大多数情况下,解析
ls
的输出是个坏主意。shell globs通常可以更安全可靠地提供相同的功能,例如,
用于i in/file directory/*