私はフォルダとファイルをchmod
しようとしていました:
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
しかし、私は疑問に思っていました:
find
を使用し、ディレクトリ.
と..
を除外して1行で実行する方法
find -exec
とxargs
のどちらの方法が良いですか?
Sherlockは(1)を取得しました。これは、(2)の場合、xargs
が一般的に望ましい方法です。これにより、構文がより合理的になり、シェル呼び出しのオーバーヘッドが少なくなります。スペースと特殊文字を含むパスが作業を台無しにする可能性があるため、それぞれ検索する-print0
オプションと-0
オプションおよびxargsに注意してください。
1回限りの実行の場合、巨大なツリーをchmodingしない限り、違いは実際には問題になりません。スクリプトに形式化するのに十分な頻度でこれを行う場合は、xargsを使用します。
find
またはxargs
の使用は必須ですか?
そうでない場合は、次を使用できます。
chmod -R u=rwX,go=rX *
これは、chmodの名前付き引数を使用して実行できます。
chmod u=rwX,go=rX {}
大文字のX
は、ディレクトリである場合にのみ実行可能ファイルへのアクセス許可を変更する重要な部分です。詳細については、 マニュアルページ を参照してください。
find . -type d -exec chmod 755 {} + -or -type f -exec chmod 644 {} +
find ... -exec ... +
はfind ... -exec ... \;
に似ていますが、一致するファイルの大きなセットごとにコマンドが1回だけ実行される点が異なります。
昔々、find OPTIONS... -exec COMMAND... \;
は一度に1つのファイルを処理する必要がありました。そのため、xargs
は、効率を上げるためにアクションをグループ化するために考案されました。しかし、xargs
は、独自の問題を引き起こしました。find
が生成できない方法で引用された入力を想定しています。したがって、ファイル名にfind OPTIONS... | xargs COMMAND...
または空白が含まれていないことがわかっていない限り、'"\
は適切ではありません。
次に、GNU find OPTIONS... -print0 | xargs -0 COMMAND...
を発明しました。これにより、任意の文字をファイル名に表示できます。しかし、他の人がそれを採用するのに長い時間がかかり、その間にSun(私は思う)find OPTIONS... -exec COMMAND... +
を発明しました。これは、xargs
と同じグループ化ジョブを実行しますが、複雑さは追加されません(コマンドラインが長くなり、find
コマンドごとに1つに制限されます)。現在はfind ... -exec ... +
は標準であり( Single Unix v )、xargs -0
よりも広く利用できます。古いLinuxシステムとの互換性を維持する必要がない限り、xargs
を忘れてください。