findコマンドの出力をパイプする

findコマンドの出力をパイプする

私が投稿した質問にさらに付け加えると、 sh で find を使用する - コマンドが機能しない

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

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

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

答え1

ファイルを実行するには、別の-execを追加できます。必要ない場合は を削除します。findchmod-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を有効にします。シェル オプションは、一致しないパターンを展開せずに残すのではなく、非表示にします。シェル オプションは、パターンを非表示の名前と一致させます。**nullglobdotglob

シェルではzsh、これは次のように短縮されることがあります。

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

...ここで.、、およびNはテストDに対応し-f(ただし、シンボリック リンクには一致しません)、順に、およびnullglobを設定します。dotglobbash

関連情報