web-dev-qa-db-ja.com

ディレクトリではなくファイルのchmodを変更する

Chmodを使用して、すべてのファイルを664に再帰的に変更する必要があります。フォルダーをスキップしたいと思います。私はこのようなことをすることを考えていました

ls -lR | grep ^-r | chmod 664

これは機能しません。chmodにパイプできないので、これを行う簡単な方法を知っている人はいますか?

ありがとう

67
Ori

find -exec答えは良いものですが、ファイルごとに個別のサブプロセスを作成するという通常は無関係な欠点に悩まされています。ただし、完全に機能し、ファイル数が実際にになった場合にのみパフォーマンスが低下します。 xargsを使用すると、ファイルのgroupのサブプロセスを実行する前に、ファイル名が大きなグループにまとめられます。

xargsを使用する際には、スペース、改行、その他の特殊文字が埋め込まれたファイル名を適切に処理するように注意する必要があります。

これらの両方の問題を解決する解決策は次のとおりです(十分なfindおよびxargs実装があると仮定します):

find . -type f -print0 | xargs -0 chmod 644

-print0により、findは、出力ストリーム上のファイル名をNUL文字(スペースではなく)と-0からxargsは、入力形式としてそれを期待すべきであることを知らせます。

101
paxdiablo

これを行う別の方法は、find ... -exec ... 次のように:

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

問題は、-execは、すべてのファイルに対してchmodプロセスを開始します。 xargsアプローチはこれを回避し、「パス名のスペース」問題に対処できるfindおよびxargsのバージョンがあれば優れています。受け入れられた答えを参照してください。

また、レコードについては、chmodeするファイルが多すぎる場合、またはパス名の合計長が大きすぎる場合、バックティックの使用は中断されます。

29
Stephen C

私の簡潔な2セント...

Linux:

$ chmod 644 `find -type f`

OSX:

$ chmod 644 `find . -type f`

これは、現在のディレクトリとそのすべてのサブディレクトリに含まれるすべてのファイルを再帰的に変更するために機能します。別のディレクトリをターゲットにする場合は、.正しいパスで:

$ chmod 644 `find /home/my/special/folder -type f`
18
Arman H

http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed

「find。-type f -print | xargs chmod 444」は動作しませんか?そうでない場合は、を見つけます。 -print> myfile.shおよびvi myfile.shでディレクトリを削除し(あまり多くないはずです)、次に1、$ s/^/chmod 444 /およびsh myfile.shを削除します。

2
b0x0rz

with GNU find

find /path -type f -exec chmod 644 {} +;

2
ghostdog74