请注意,这只是一个伪代码来说明问题:
目录结构:
# tree
.
├── dir1
│ ├── d1_file1
│ ├── d1_file2
│ └── d1_file3
└── dir2
├── d2_file1
├── d2_file2
└── d2_file3
2 directories, 6 files
脚本:
#!/bin/bash
list=(
dir1
dir2
)
for dir in ${list[@]}; do
ls -1 ./tmp/${dir} | while read -a file; do
files+=(${file})
echo "${dir} has ${#files[@]} files(s)"
echo "${dir} files: ${files[@]}"
done
done
当前输出:
# bash tmp.sh
dir1 has 1 files(s)
dir1 files: d1_file1
dir1 has 2 files(s)
dir1 files: d1_file1 d1_file2
dir1 has 3 files(s)
dir1 files: d1_file1 d1_file2 d1_file3
dir2 has 1 files(s)
dir2 files: d2_file1
dir2 has 2 files(s)
dir2 files: d2_file1 d2_file2
dir2 has 3 files(s)
dir2 files: d2_file1 d2_file2 d2_file3
期望的结果:
# bash tmp.sh
dir1 has 3 files(s)
dir1 files: d1_file1 d1_file2 d1_file3
dir2 has 3 files(s)
dir2 files: d2_file1 d2_file2 d2_file3
基本上我想为for loop
中存储来自ls
命令的值的每个项目构建一个单独的数组。
答案 0 :(得分:2)
为了仅为每个目录输出一次计数,您需要将打印移出while read
循环。但是,我建议完全删除它。尝试这样的事情:
#!/bin/bash
list=(
dir1
dir2
)
for dir in "${list[@]}"; do
files=( ./tmp/"$dir"/* )
echo "${dir} has ${#files[@]} files(s)"
echo "${dir} files: ${files[@]}"
done
这使用glob用files
数组填充每个目录的内容。
通常,应该避免解析ls
。
答案 1 :(得分:1)
您只需使用pathname expansion (globbing)来捕获子目录中的所有文件:
list=(
dir1
dir2
)
for dir in "${list[@]}"; do
files=( ./tmp/"${dir}"/* ) # collect all matches in array
echo "${dir} has ${#files[@]} files(s)"
echo "${dir} files: ${files[@]}"
done
请注意我是如何双引号${list[@]}
和${dir}
来保护自己的shell expansions值。
相比之下,*
必须 不加引号,以便触发路径名扩展。