如何从find命令中排除特定目录的子目录?

问题描述

@H_404_0@我正在尝试获取一个文件列表,我可以将其传送到wc -l获取所有文件的字数统计(不直接使用wc,因此我可以在使用之前过滤文件列表命令)。

@H_404_0@我的目录结构是这样的:

- folder
   - file.PHP
   - file2.html
   - file3.PHP
   - folder1
   - folder2a
   - folder3b
   - folder4
- file.PHP
- file2.PHP
@H_404_0@我想在我的find中排除某些目录,主要是库和其他我没有做的东西。我可以这样手动进行:

@H_404_0@ find /var/www/html/ -type f -not -path "/var/www/html/folder/folder1" -not -path "/var/www/html/folder/folder2a"

@H_404_0@但是,必须显式指定所有文件夹很烦人,列表也可以随时更改。我尝试使用/*/**进行模式匹配,但这都不起作用。 在我的find命令中是否有一种方法可以排除某个目录的所有子目录,但不能排除该目录本身?包括文件,但不包括其任何子目录?

@H_404_0@这是一个直观的猜测:

find /var/www/html -not -path '/var/www/html/someotherbadfolder' -type f \( ! -path "/var/www/html/folder" -maxdepth 1 \)
@H_404_0@但是,即使find对此也有抱怨:

find: warning: you have specified the -maxdepth option after a non-option argument -not,but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.
@H_404_0@所以看来maxdepth无法合并到一个操作中。

@H_404_0@有很多关于排除特定子目录的问答,但是一般而言,不排除特定子目录中的任何子目录。

@H_404_0@我能够使用-maxdepth 1在单个目录中运行它,但是问题是这是一个较大命令的排除部分,一旦我运行了完整命令,该命令便无法正常工作。可能我可能需要排除特定的子目录以及其他几个特定子目录中的任何子目录。

解决方法

假设您要查找文件(即不是目录):

find /var/www/html -type f -not -path "/var/www/html/folder/*/*"

那是因为:

  • 直接位于/var/www/html/folder下的文件不是目录,因此与-path子句不匹配。
  • /var/www/html/folder下的目录与-type f不匹配。
  • /var/www/html/folder子目录下的
  • 文件必须在路径中具有额外的/,因此它们与-path表达式匹配。
,

只需查找:

find /var/www/html -type f -not -path '/var/www/html/folder/*/*'

原始答案:

在find的输出上可能是grep -v的黑客事件

find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l