私が投稿した質問にさらに付け加えると、 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
...ここで.
、、およびN
はテストD
に対応し-f
(ただし、シンボリック リンクには一致しません)、順に、およびnullglob
を設定します。dotglob
bash