findコマンドの-execで2つのbashコマンドを使用する方法は?

findコマンドの-execで2つのbashコマンドを使用する方法は?

コマンドセクションで-exec2つのコマンドを使用できますかfind

私は同様のことを試しました:

find . -name "*" -exec  chgrp -v new_group {}  ; chmod -v 770 {}  \;

私は得る:

find: -exec 引数がありませ
ん chmod: アクセスできません {}: 対応するファイルまたはディレクトリがありません
chmod: アクセスできません;: 対応するファイルまたはディレクトリがありません

答え1

コマンドの場合は、さらにコマンドを追加することもfindできます-exec

find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;

このコマンドの結果は、以下を使用するのと同じです。

chgrp -v new_groupファイル&&chmod -v 770ファイル

すべてのファイルに。

findなどのすべてのパラメータ-nameは実際には-exec-sizeテストfindこれまでチェーン全体が評価されている限り、1つずつ実行されます。本物。したがって、各連続-exec命令が実行される。〜しない限り以前の返品本物(つまり、0コマンドの終了状態) しかし、find論理演算子も理解する。または-o)といいえ!)。したがって、一連の-execテストを使用してにもかかわらず前の結果では、次のようなものを使用する必要があります。

find . -name "*" \( -exec chgrp -v new_group {} \; -o -true \) -exec chmod -v 770 {} \; 

答え2

find . -name "*" -exec sh -c 'chgrp -v new_group "$0" ; chmod -v 770 "$0"' {} \;

答え3

コマンドは最初にシェルで区切られた2つのコマンドに解析されます;。これは改行文字に対応します。

find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;

シェルコマンドを実行するには、シェルを明示的に呼び出しますbash -c(またはsh -c関係がない場合は特に bash を実行します)。

find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;

{}シェルとして使用される引数は0番目の引数(通常はシェルまたはスクリプトの名前ですが、ここでは重要ではありません)なので、引用されます"$0"

一度に複数のファイル名をシェルに渡し、シェルでそのファイルを繰り返すことができ、速度が速くなります。ここでは_これをスクリプト名として渡し、次のパラメータはファイル名ですfor x(のショートカットfor x in "$@")。

find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +

bash 4やzshからはここをまったく見る必要はありません。 Bashで再帰ディレクトリglobの状態を有効にするには、実行shopt -s globstar(に入力)してください。 (zshでは常に有効になっています。)~/.bashrc**/

chgrp -v new_group -- **/*; chmod -v 770 -- **/*

またはファイルを順番に繰り返す場合

for x in **/*; do
  chgrp -v new_group -- "$x"
  chmod -v 770 -- "$x"
done

このコマンドとの違いの1つは、シェルがfindドットファイル(名前で始まるファイル.)を無視することです。これを含めるには、bashで最初に設定し、GLOBIGNORE=.:..zshで**/*(D)globモードとして使用します。

関連情報