Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何限制循环,使每个值只循环一次_Bash - Fatal编程技术网

Bash 如何限制循环,使每个值只循环一次

Bash 如何限制循环,使每个值只循环一次,bash,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/”

使用以下方法获得两个阵列:

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个大小为409640961248024620的目录,它将只在前两个目录上调用ls-lRa,而忽略最后两个目录

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


我上面的尝试似乎不起作用,但提供了一些关于我尝试的解释。

这将在当前目录下大于
minSize
字节的任何dir/subdir上运行
ls-la
。因为我们使用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 {} +)
#/bin/bash
取消设置IFS
minSize=10000
而读取-r-d$'\0'大小目录;做
如果((尺寸<最小尺寸));然后
回声
ls-la“$dir”
fi

完成<这将在当前目录下大于
minSize
字节的任何dir/subdir上运行
ls-la
。因为我们使用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 {} +)
#/bin/bash
取消设置IFS
minSize=10000
而读取-r-d$'\0'大小目录;做
如果((尺寸<最小尺寸));然后
回声
ls-la“$dir”
fi
完成<

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

for s in ${!array1[*]} 
您不需要第二个for循环。
(非主题:对于数组索引,不需要
$
,不需要
pwd
构造)

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

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

for s in ${!array1[*]} 
您不需要第二个for循环。
(非主题:对于数组索引,不需要
$
,不需要
pwd
构造)

理解这个答案后,再看看@SiegeX答案的实现。我认为是您添加了一个额外的for循环导致了该问题。

他的建议避免了解析
ls
和使用数组。

我不知道如何调用
ls-lRa
,但要确保is跳过任何文件大小超过10000字节的dir。因此,它只会列出少于10000字节的目录的内容,然后它会递归地查找这些目录,列出少于10000字节的目录,忽略不少于10000字节的目录,依此类推。@Cyrus我已经添加了您的“@'@bashprofile84如果您走错了路,您永远不应该解析
ls
的输出。与其问如何修复损坏的实现,我宁愿给出您试图解决的问题的细节。最好的解决方案可能与您正在做的事情看起来非常不同。从所需输入中获得所需输出是最好的方法。@SiegeX,我现在已经编辑了我的问题。我不知道还有什么方法可以调用
ls-lRa
,但请确保它跳过任何文件大小超过10000字节的目录。因此,它只会列出少于10000字节的目录的内容,然后它会递归地查找这些目录,列出少于10000字节的目录,忽略不少于10000字节的目录,依此类推。@Cyrus我已经添加了您的“@'@bashprofile84如果您走错了路,您永远不应该解析
ls
的输出。与其问如何修复损坏的实现,我宁愿给出您试图解决的问题的细节。最好的解决方案可能与您正在做的事情看起来非常不同。从所需输入中获得所需输出是最好的方法。@SiegeX,我现在编辑了我的问题。我尝试了这个方法,它似乎永远挂不住了,我只是在上一个级别之前对它进行测试,所以这不是因为通过多个级别需要时间。。你知道这是为什么吗?确保
find-mindepth1-depth-typed-execdu-b{}+
输出有效目录。这是什么循环