find<の-exec部分で2つのコマンドを使用することはできますか? / div>コマンド?

次のようなものを試しました:

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

次のようになります:

find:-execへの引数がありません
chmod:アクセスできません{}:そのようなファイルまたはディレクトリはありません
chmod:アクセスできません;:そのようなファイルまたはディレクトリはありません

コメント

  • -name "*"はすべての名前に一致することに注意してください。したがって、'削除可能なno-opテストです。また、chmodchgrpには、再帰操作用の-Rオプションがあります。

回答

findコマンドについては、-execコマンドを続けて追加することもできます。

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

このコマンドは、結果としてt、使用と同等

chgrp -v new_group file & & chmod -v770ファイル

各ファイル。

-name、iv id = “a2d0ebcce4など、すべてのfind“のパラメータ”>

-sizeなどは、実際にはテストfindは、これまでのチェーン全体が true と評価されている限り、それらを1つずつ実行し続けます。したがって、連続する各-execコマンドは、前のコマンドが true (つまり、0コマンドの終了ステータス)。ただし、findは、または-o)や not などの論理演算子も理解します。 (!)。したがって、前の結果の-execテストのチェーンを使用するには、に関係なく次のようなものを使用する必要があります:

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

コメント

  • +1:はい、その'はそれを行うための最もエレガントな方法です。 '{}'(中括弧の周りのアポストロフィ)を使用する理由を説明できる場合は、 unix.stackexchange.com/q/にアクセスしてください。 8647/4485
  • @user残念ながら、それがまだ必要かどうかはわかりません'。私はちょうど今いくつかのテストを行いましたが、'それが何かを変えるような状況に遭遇していません。 'は"グッドプラクティス"でなくなると思います。
  • 名前にスペースが含まれるファイルの場合、引用符は重要です。
  • @ naught101いいえ、fishおよびcshですが、POSIXのようなシェル(shdashbashzshkshyash)。

回答

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

コメント

  • @Gilles:-c 'の奇妙な処理の驚異$ 0の場合、これは一見するたびに間違っていると思いますが、間違いなく正しいです。
  • 明示的なシェルが定義されているのが好きです…
  • この回答(およびGiles 'はswer)は、sh -cを考えると質問に対するより良い答えのようです。

回答

コマンドは最初にシェルによって解析され、;で区切られた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 xfor x in "$@"のショートカット)が繰り返すファイル名。

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

bash 4以降、またはzshでは、ここで検索する必要はまったくありません。bashでは、(~/.bashrcに配置)**/をアクティブにして、再帰的なディレクトリグロブを表します(zshでは、これは常にアクティブです。)次に

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

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

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

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

コメント

  • この回答(およびGlenn 'の回答)は、

  • chgrpchmodの両方に
  • 再帰操作のオプション。