很抱歉再次提出这个问题。我已经收到了答案,但使用find
但不幸的是我需要在不使用任何预定义命令的情况下编写它。
我正在尝试编写一个脚本,它将以递归方式循环遍历当前目录中的子目录。它应检查每个目录中的文件计数。如果文件计数大于10,它应该在名为“BigList”的文件中写入这些文件的所有名称,否则它应该写入文件“ShortList”。这应该是:
---<directory name>
<filename>
<filename>
<filename>
<filename>
....
---<directory name>
<filename>
<filename>
<filename>
<filename>
....
我的脚本仅在子目录不包含子目录时才有效。 我对此感到困惑,因为它不能像我期望的那样工作。 这是我的剧本
#!/bin/bash
parent_dir=""
if [ -d "$1" ]; then
path=$1;
else
path=$(pwd)
fi
parent_dir=$path
loop_folder_recurse() {
local files_list=""
local cnt=0
for i in "$1"/*;do
if [ -d "$i" ];then
echo "dir: $i"
parent_dir=$i
echo before recursion
loop_folder_recurse "$i"
echo after recursion
if [ $cnt -ge 10 ]; then
echo -e "---"$parent_dir >> BigList
echo -e $file_list >> BigList
else
echo -e "---"$parent_dir >> ShortList
echo -e $file_list >> ShortList
fi
elif [ -f "$i" ]; then
echo file $i
if [ $cur_fol != $main_pwd ]; then
file_list+=$i'\n'
cnt=$((cnt + 1))
fi
fi
done
}
echo "Base path: $path"
loop_folder_recurse $path
如何修改脚本以生成所需的输出?
答案 0 :(得分:0)
此bash脚本生成所需的输出:
#!/bin/bash
bigfile="$PWD/BigList"
shortfile="$PWD/ShortList"
shopt -s nullglob
loop_folder_recurse() {
(
[[ -n "$1" ]] && cd "$1"
for i in */; do
[[ -d "$i" ]] && loop_folder_recurse "$i"
count=0
files=''
for j in *; do
if [[ -f "$j" ]]; then
files+="$j"$'\n'
((++count))
fi
done
if ((count > 10)); then
outfile="$bigfile"
else
outfile="$shortfile"
fi
echo "$i" >> "$outfile"
echo "$files" >> "$outfile"
done
)
}
loop_folder_recurse
shopt -s nullglob
,以便当目录为空时,循环不会运行。函数的主体在( )
内,因此它在子shell中运行。这是为了方便,因为这意味着当子shell退出时函数返回到上一个目录。
希望脚本的其余部分是相当不言自明的,但如果没有,请告诉我,我很乐意提供其他解释。