如何限制循环,以便仅对每个值循环一次

时间:2020-06-01 16:13:24

标签: bash

使用以下两个数组获得

array1=($(ls -lad */ | awk '{print $5}'))

array2=($(ls -lad */ | awk '{print $9}'))

两个数组排版:

declare -a array1='([0]="4096" [1]="4096" [2]="4096" [3]="4096" [4]="4096" [5]="4096" [6]="4096" [7]="4096" [8]="4096")'

declare -a array2='([0]="bod/" [1]="working/" [2]="firm/" [3]="symbol/" [4]="info/" [5]="scripts/" [6]="development/" [7]="design/" [8]="testing/")'

对于小于10000的文件,它将获取这些目录名称的路径,并创建要在ls lRa命令中使用的完整路径,该命令将递归列出目录大小小于10000的目录

我目前对8个目录名有8个文件大小,在当前级别上这些文件名的大小小于10000,而不仅仅是在执行8次后仅打印每个目录名的路径。我以为是因为我配置了for循环错误。

for s in ${!array1[*]} 
do
    if [ ${array1[$s]} -lt 10000 ]
    then 
        for dir in ${!array2[@]} 
        do
            paths=$(pwd {array2[$dir]}) 
            echo "$paths/${array2[$dir]}"
        done  
    else
        :
    fi 
done

我已经编辑了我的问题:

我想创建一个给定路径的脚本,即/a/path/to/use,它将从该路径调用ls -lRa

但是,仅当目录及其子目录的大小小于10000个字节时,才应在目录及其子目录上调用ls -lRa。

例如,如果/a/path/to/use包含4个大小为4096,4096,12480,24620的目录,它将仅对前两个调用ls -lRa,而忽略最后两个。

一旦调用了ls命令,它将对该目录中的所有目录执行相同的操作,依此类推,直到从原始路径检查了文件结构中的所有目录。

我上面的尝试似乎没有用,但是提供了有关我正在尝试的内容的解释。

2 个答案:

答案 0 :(得分:0)

这将在当前目录下大于ls -la个字节的任何目录/子目录上运行minSize。因为我们使用NULL作为分隔符来解析find的输出,所以可以避免困扰ls的陷阱。

注意:因为find本质上是递归的,所以我们 不是 需要递归运行ls

#!/bin/bash

unset IFS
minSize=10000

while read -r -d $'\0' size dir; do
  if (( size < minSize )); then
    echo "############## $dir ##############"
    ls -la "$dir"
  fi
done < <(find . -mindepth 1 -depth -type d -exec du -b0 {} +)

答案 1 :(得分:0)

使用

for dir in ${!array2[@]} 

您将遍历array2的所有元素。 您已经在使用

遍历元素
for s in ${!array1[*]} 

您不需要第二个for循环。
(离题:您不需要$来获取数组索引,不需要pwd的构造)

for s in ${!array1[*]} 
do
    if [ ${array1[s]} -lt 10000 ]
    then 
       echo "$PWD/${array2[s]}"
    fi 
done

当您理解此答案时,请再看一下@SiegeX答案的实现。我认为您添加了一个额外的for循环导致此问题。
他的建议避免解析ls和使用数组。