web-dev-qa-db-ja.com

再帰的にchmod

私はフォルダとファイルをchmodしようとしていました:

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

しかし、私は疑問に思っていました:

  1. findを使用し、ディレクトリ...を除外して1行で実行する方法

  2. find -execxargsのどちらの方法が良いですか?

6
user1538

Sherlockは(1)を取得しました。これは、(2)の場合、xargsが一般的に望ましい方法です。これにより、構文がより合理的になり、シェル呼び出しのオーバーヘッドが少なくなります。スペースと特殊文字を含むパスが作業を台無しにする可能性があるため、それぞれ検索する-print0オプションと-0オプションおよびxargsに注意してください。

1回限りの実行の場合、巨大なツリーをchmodingしない限り、違いは実際には問題になりません。スクリプトに形式化するのに十分な頻度でこれを行う場合は、xargsを使用します。

2
msw

findまたはxargsの使用は必須ですか?

そうでない場合は、次を使用できます。

chmod -R u=rwX,go=rX *
10
mouviciel

これは、chmodの名前付き引数を使用して実行できます。

 chmod u=rwX,go=rX {}

大文字のXは、ディレクトリである場合にのみ実行可能ファイルへのアクセス許可を変更する重要な部分です。詳細については、 マニュアルページ を参照してください。

3
delete
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を忘れてください。