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{}+
输出有效目录。这是什么循环