コマンドセクションで-exec
2つのコマンドを使用できますか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モードとして使用します。