我想递归搜索目录树,并列出每个文件夹中具有与给定字符串相对应的名称的文件数。实际上,我想返回以下结果:
ls -l | wc -l
对于我通过确定的每个文件夹find
。
下面的代码正确列出了每个文件夹中包含Magic Data字符串的文件数。
find /path/to/cool/stuff \
-maxdepth 4 \
-type d \
-name '*Magic Data*' \
-print0 | xargs \
--verbose \
-0 -I {} ls -l {}
我想扩展它,并将结果ls
传送到wc -l
。
find /path/to/cool/stuff \
-maxdepth 4 \
-type d \
-name '*Magic Data*' \
-print0 | xargs \
--verbose \
-0 -I {} ls -l {} | wc -l
这将失败并打印:
ls -l /path/to/cool/stuff/some/folders/Magic Data
ls -l /path/to/cool/stuff/some/folders2/Magic Data
/path/to/cool/stuff/some/folders/Magic Data 29
/path/to/cool/stuff/some/folders2/Magic Data 30
所需的输出将包含:
wc -l
,在这种情况下,这反映了未隐藏文件的数量解决此问题的方法主要有两种:
修改find
命令,使其仅输入您感兴趣的目录,然后x
为其中的每个找到的文件打印一个字符(例如)。然后计算用产生的那个字符的数量wc -l
。输出字符比路径名更安全,因为Unix中的路径名可能包含换行符。这个解决方案有点棘手,因为它涉及-prune
到忽略我们不感兴趣的目录,或者使用! -path
。
就像到目前为止一样,找到目录,然后使用内联脚本对其中的文件进行计数。这比较简单,下面是我要显示的内容。
find /path/to/cool/stuff -maxdepth 4 -type d -name "*Magic Data*' \
-exec bash -O dotglob -c '
dir=$1
set -- "$dir"/*
printf "%s %d\n" "$dir" "$#"' bash {} ';'
在这里,我们像您一样找到目录,然后针对每个目录运行以下简短bash
脚本:
dir=$1
set -- "$dir"/*
printf "%s %d\n" "$dir" "$#"
这将从命令行获取目录的路径名(由给定find
),并扩展其中的*
glob模式。通过dotglob
在脚本的命令行上设置shell选项,可以确保我们也计算隐藏文件和目录(删除-O dotglob
时不计算隐藏名称)。
我们将所有名称扩展为的参数set
,这会将位置参数设置为扩展的条目。位置参数的数量可以作为$#
,因此也是该特定目录中文件的数量。
有关的:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句