特定のディレクトリのサブディレクトリをfindコマンドから除外するにはどうすればよいですか?
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
が、問題は、これがより大きなコマンドの除外部分であり、完全なコマンドを実行すると機能しなかったことです。潜在的に、特定のサブディレクトリだけでなく、他のいくつかの特定のサブディレクトリ内のサブディレクトリも除外する必要があるかもしれません。
回答
検索するだけで:
find /var/www/html -type f -not -path '/var/www/html/folder/*/*'
元の答え:
1つのハックがgrep -v
findの出力にある可能性があります。
find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
特にファイル(つまりディレクトリではない)を探していると仮定します。
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
式と一致します。