find
<の-exec
部分で2つのコマンドを使用することはできますか? / div>コマンド?
次のようなものを試しました:
find . -name "*" -exec chgrp -v new_group {} ; chmod -v 770 {} \;
次のようになります:
find:-execへの引数がありません
chmod:アクセスできません{}:そのようなファイルまたはディレクトリはありません
chmod:アクセスできません;:そのようなファイルまたはディレクトリはありません
コメント
回答
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のようなシェル(sh
、dash
、bash
、zsh
、ksh
、yash
)。
回答
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 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では、(~/.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 'の回答)は、
。
-
chgrp
とchmod
の両方に
再帰操作のオプション。
-name "*"
はすべての名前に一致することに注意してください。したがって、'削除可能なno-opテストです。また、chmod
とchgrp
には、再帰操作用の-R
オプションがあります。