如何使用该find
命令来查找不包含特定文件的目录?例如,如果我有一堆应该受到修订控制的目录,我可以搜索并找到没有子目录的目录.git
吗?或者,我的项目指定所有模块都应该有一个utilities.py
文件;如何搜索哪些子目录还没有所需的文件?
答案1
这解决方案可能适合你的情况是,
find . -type d '!' -exec test -e "{}/utilities.py" ';' -print
测试
- 我创建了4个子目录,名为目录1,目录2,目录3和 带空格的目录。我想测试这是否同样能很好地处理空格,这就是为什么我创建了一个名称中包含空格的目录。
- 我创建了文件文件1,文件2,文件3和文件4在目录2 和目录3。
- 在目录1, 我创建文件1,文件2,文件3。
- 在带空格的目录,我创建了一个名为带空格的文件。
现在,我执行 find 命令,
find . -type d '!' -exec test -e "{}/file with spaces" ';' -print
我得到的输出是
. ./dir1 ./dir2 ./dir3
正如预期的那样,由于目录带空格的目录包含名为的文件带空格的文件它没有在输出中列出。如果我将
find
命令更改为文件4在其中,我得到的输出是,. ./dir with spaces ./dir1
编辑
但是,如果我们在最终级别嵌套了子目录和文件,则上述方法似乎不起作用。因此,为了克服这种情况,您可以将您的发现修改为类似讨论的内容这里。
find . -type f -not -name 'utilities.py' -exec dirname {} \; | sort -u
正如吉尔斯在他的书中所暗示的那样评论,
对于
.git
,跳过父级包含 的目录会更有用.git
。您可以通过在正确的位置添加 -prune 来做到这一点:find . -type d -exec test -e "{}/.git" ';' -prune -o -print