私が投稿したクエリに応じて - 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
組み合わせることができます。chmod
sh -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
に対応します。-f
nullglob
dotglob
bash