我想出了以下代码片段来计算每个子目录中的文件数量:
for x (**/*(/)); do print $x; find $x -maxdepth 1 -type f | wc -l; done
该命令输出连续的对(一对在下),如下所示:
directory_name
# of files
我想将上面的代码更改为:
- 在同一行打印每个匹配项(即
directory_name ':' # of files
) - 仅当文件夹位于目录树中时才对文件进行计数(即它们没有任何子文件夹)。
我怎样才能做到这一点?
答案1
尝试这个:
for dir in $( gfind . -type d -print ); do files=$( find $dir -maxdepth 1 -type f | wc -l ); echo "$dir : $files"; done
或者,在脚本中,您可以有更多的灵活性:
#!/usr/bin/ksh
# pass in the directory to search on the command line, use $PWD if not arg received
rdir=${1:-$(pwd)}
# if $rdir is a file, get it's directory
if [ -f $rdir ]; then
rdir=$(dirname $rdir)
fi
# first, find our tree of directories
for dir in $( gfind $rdir -type d -print ); do
# get a count of directories within $dir.
sdirs=$( find $dir -maxdepth 1 -type d | wc -l );
# only proceed if sdirs is less than 2 ( 1 = self ).
if (( $sdirs < 2 )); then
# get a count of all the files in $dir, but not in subdirs of $dir)
files=$( find $dir -maxdepth 1 -type f | wc -l );
echo "$dir : $files";
fi
done
#!/usr/bin/zsh
我使用 ksh 作为 shell 脚本,但它与, 或 一起使用也同样有效/usr/bin/bash
。
答案2
又快又脏
find . -type d | \
while IFS= read -r d; do
f=$(ls -F "$d");
echo "$f" | egrep -q "/$" || \
echo $d : $(echo -n "$f"|wc -l) files;
done