find は、1 つのコマンドで複数の名前とパスを結合します。

find は、1 つのコマンドで複数の名前とパスを結合します。

見つけて反応する必要があるかなり複雑なファイルセットがあります(たとえば、テキストファイルにコピーされたパス)。

たとえば、

 find / \( -iname "*ssh*" -or -iname "*scp*" \) \( -not -path -"/run" -not -path "/rw/*" -and -not -path "/home/*" -and -not -path "*/qml/*" \) >> ~/files.txt

ここでは、「ssh」と「scp」に関連するすべてのファイルまたはフォルダを検索したいが、/runまたは/rwディレクトリにはありません。

ここにさらに条件を追加したいのですが、コマンドが長すぎます。正規表現でこれをどのように実行できますか?

ベストアンサー1

以下を使用して、そのディレクトリ内のファイルをフィルタリングするよりもまったく除外したいディレクトリに入れないことをお勧めします! -path <pattern>

LC_ALL=C find / \
       '(' \
          -path /run -o  -path /rw -o -path /home -o -path '*/qml' \
       ')' -prune -o '(' \
          -name '*[sS][hH][hH]*' -o -name '*[sS][cC][pP]*' \
       ')' -print

ここではPOSIX構文が使用されますfind。 GNUの場合は、find次のようになります。

LC_ALL=C find / -regextype posix-extended \
  -regex '/home|/rw|.*/qml' -prune -o \
  -iregex '.*s(cp|sh)[^/]*' -print

BSDを使用すると、次のようなものを使用してPOSIX EREを取得できますfind-Egrepsed

LC_ALL=C find -E / \
  -regex '/home|/rw|.*/qml' -prune -o \
  -iregex '.*s(cp|sh)[^/]*' -print

おすすめ記事