使用以下两个数组获得
: 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命令,它将对该目录中的所有目录执行相同的操作,依此类推,直到从原始路径检查了文件结构中的所有目录。
我上面的尝试似乎没有用,但是提供了有关我正在尝试的内容的解释。
答案 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
和使用数组。