我有一个包含目录列表的文件,我想知道每个目录中有多少个文件。
.../图像/idsuffix/用户ID/
这将给我前 5 个目录而不是每个目录的文件和目录的数量。
查找 ./images/00{0..5}/ | wc
我想要的是每个目录的内容计数。我尝试将其传递给 xargs,但结果相同,并生成所有目录的计数。
ls ./images/ > directories.lst
cat directories.lst | xargs -i{} find {} | wc
这根本不产生任何输出。
cat directories.lst | xargs -I{} bash -s "find {} | wc"
答案1
您可以使用 for 循环:
for dir in ./images/* ; do echo $dir ; ls "$dir" | wc ; done
如果您也希望包含点文件,请使用ls -a
。
如果您也想计算点目录中的文件数量,请使用for dir in ./images/* ./images/.*
。
如果有一些非目录,可以添加测试:
for dir in ./images/* ; do
if [[ -d $dir ]] ; then
echo $dir
ls "$dir" | wc
fi
done
答案2
如果您想从文件中读取目录列表,请执行以下操作:
$ for dir in $(cat directories.lst); do echo "$dir : `ls $dir | wc -l`"; done
但是,您不需要该文件:
$ for dir in $(find images/ -type d); do echo "$dir : `ls $dir | wc -l`"; done
如果你只想要顶级目录:
$ for dir in $(find images/ -maxdepth 1 -type d); do echo "$dir : `ls $dir | wc -l`"; done
最后,如果文件名中有空格,请执行以下操作:
$ SAVEIFS=$IFS; IFS=$(echo -en "\n\b"); for dir in $(find images/ -type d); do echo "$dir : `ls $dir | wc -l`"; done; IFS=SAVEIFS
答案3
在命令的 -exec 部分使用 sh,您可以启动另一个 shell 并在其中顺利运行命令。
查找 . -name "*.dat" -exec csh -c ‘echo -n $1; grep ID $1 | wc -l’ {} {} \;
或者在我的情况下,当计算目录中的文件数时。我使用“ls -f”,因为它会产生未排序的 ls 输出,这比在计算之前尝试对输出进行排序要快得多。
目录名称和目录数之间有换行符
查找 /somedir/some/dir -type d -print -exec sh -c ' ls -f $1/* | wc -l' {} {} \;
输出如下所示
/目录/somedir/002/1066002
6
目录名称和计数之间用制表符分隔
查找 /somedir/some/dir -type d -exec bash -c'echo -en“$1\t”; ls -f $1/* | wc -l'{} {} \;
输出如下所示
/目录/somedir/002/1066002 6
http://www.compuspec.net/reference/os/solaris/find/find_and_execute_with_pipe.shtml