特定のディレクトリのサブディレクトリをfindコマンドから除外するにはどうすればよいですか?

Aug 15 2020

wc -lすべての単語数を取得するためにパイプできるファイルのリストを取得しようとしています(wc直接使用しないため、コマンドを使用する前にファイルリストをフィルタリングできます)。

私のディレクトリ構造は次のようなものです。

- folder
   - file.php
   - file2.html
   - file3.php
   - folder1
   - folder2a
   - folder3b
   - folder4
- file.php
- file2.php

私のfind、主にライブラリや私が作成しなかった他のものの特定のディレクトリを除外したいと思います。私はそれを次のように手動で行うことができます:

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

ただし、すべてのフォルダを明示的に指定する必要があるのは面倒であり、リストもいつでも変更される可能性があります。とを使用/*/**てパターンマッチングを試みましたが、それも機能しません。特定のディレクトリのすべてのサブディレクトリを除外できるが、そのディレクトリ自体除外できない、findコマンドのこれらの「not」の1つに方法はありますか?(ファイルは含まれますが、サブディレクトリは含まれません)?

これが直感的な推測です:

find /var/www/html -not -path '/var/www/html/someotherbadfolder' -type f \( ! -path "/var/www/html/folder" -maxdepth 1 \)

しかし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.

そのためmaxdepth、1つの操作で組み合わせることができないようです。

特定のサブディレクトリを除外することについては多くのQ&Aがありますが、一般的に特定のサブディレクトリ内のサブディレクトリはありません。

を使用して単一のディレクトリで機能させることができました-maxdepth 1が、問題は、これがより大きなコマンドの除外部分であり、完全なコマンドを実行すると機能しなかったことです。潜在的に、特定のサブディレクトリだけでなく、他のいくつかの特定のサブディレクトリ内のサブディレクトリも除外する必要があるかもしれません。

回答

jeremysprofile Aug 16 2020 at 01:10

検索するだけで:

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

元の答え:

1つのハックがgrep -vfindの出力にある可能性があります。

find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
2 root Aug 16 2020 at 01:13

特にファイル(つまりディレクトリではない)を探していると仮定します。

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式と一致します。