我想递归搜索目录树并列出每个文件夹中可用的文件数量,这些文件的名称与给定字符串对应。实际上,我想返回以下结果:
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
传递给 to 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
.就像您到目前为止所做的那样查找目录,然后使用内联脚本来计算其中的文件。这更简单,我将在下面显示。
在这里,我们像你一样找到目录,然后,对于每个目录,我们运行这个简短的
bash
脚本:这从命令行获取目录的路径名(由 给出
find
),并在其中扩展*
glob 模式。通过dotglob
在脚本的命令行上设置 shell 选项,我们可以保证还计算隐藏文件和目录(删除-O dotglob
以不计算隐藏名称)。我们将所有名称扩展为 的参数
set
,这会将位置参数设置为扩展条目。位置参数的数量可用作$#
,因此它也是该特定目录中的文件数。有关的:
从您尝试的解决方案开始,这就是完成此任务的方式:
解释:
find
,您的秘诀都会被遵循。{} +
将它们交给 shell :sh
sh -c '...' find_sh {} +
sh
是第零个参数$0
,因此可以给它任何名称,在这种情况下,我们将其命名为find_sh
。这是将显示在进程列表中的名称。{} +
并形成$1 $2 $3 ...
我们正在生成的 shell 的参数。! -name .
OTW,目标目录名称也被计入 wc -l 输出。你也可以使用下面的命令来实现你想要的
在这里,我
exec
用来执行shell,然后使用optionsh
执行给它的命令。-c
在你的情况下,命令是ls -1 | wc -l