find コマンドのパイプ出力

find コマンドのパイプ出力

私が投稿したクエリに応じて - shでfindを使用する - コマンドは機能しません。

次のコマンドのo / pに従って、リストされている各ファイルの権限を777に更新する必要があります。

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls

出力をファイルにパイプしchmodてファイル権限を更新する方法はありますか?

答え1

ファイルに対して実行する-exec他の項目を追加できます。find必要でない場合は、chmod以下を削除してください。-ls

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \;\
  -ls -exec chmod 777 {} +

答え2

-exec最後に他のものを追加して、以前のテストに合格したファイルの権限を更新できます。フレディショーのように、またはインラインスクリプトでおよびをgrep組み合わせることができます。chmodsh -c

find . -type f -name '*FW*' -exec sh -c '
    for pathname do
        if grep -q -i -e "chmod.*archive" -e "archive.*chmod" "$pathname"
        then
            chmod 777 "$pathname"
        fi
    done' sh {} +

findこれはスクリプトのループのパス名ジェネレータとして使用されますsh -c

このループはインラインスクリプトに指定されたすべてのパス名を取得し、各パス名をテストし、grepファイル内のパターンが一致すると、そのファイルに対する権限が(おそらく)更新されます。


bashでは、パス名を生成する代わりにファイル名グロービングパターンを使用できます。find

shopt -s globstar nullglob dotglob

for pathname in ./**/*FW*; do
    if [ -f "$pathname" ] && grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' "$pathname"
    then
        chmod 777 "$pathname"
    fi
done

ここで顕著な唯一の違いは、パターンに一致するシンボリックリンクも処理することです。

シェルglobstarオプションを使用すると、**サブディレクトリのパターンを再帰的に一致させることができます。シェルnullglobオプションは、一致しないパターンを拡張されていないままにする代わりに消えます。dotglob隠された名前とパターンを一致させるシェルオプション。

zshシェルでは、次のように短縮できます。

for pathname in ./**/*FW*(.ND); do
    if grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' $pathname
    then
        chmod 777 $pathname
    fi
done

...where.とはNテスト(ただし、シンボリックリンクと一致しません)、setup、およびsetupの順序Dに対応します。-fnullglobdotglobbash

関連情報