Chmodを使用して、すべてのファイルを664に再帰的に変更する必要があります。フォルダーをスキップしたいと思います。私はこのようなことをすることを考えていました
ls -lR | grep ^-r | chmod 664
これは機能しません。chmodにパイプできないので、これを行う簡単な方法を知っている人はいますか?
ありがとう
find -exec
答えは良いものですが、ファイルごとに個別のサブプロセスを作成するという通常は無関係な欠点に悩まされています。ただし、完全に機能し、ファイル数が実際にになった場合にのみパフォーマンスが低下します。 xargs
を使用すると、ファイルのgroupのサブプロセスを実行する前に、ファイル名が大きなグループにまとめられます。
xargs
を使用する際には、スペース、改行、その他の特殊文字が埋め込まれたファイル名を適切に処理するように注意する必要があります。
これらの両方の問題を解決する解決策は次のとおりです(十分なfind
およびxargs
実装があると仮定します):
find . -type f -print0 | xargs -0 chmod 644
-print0
により、find
は、出力ストリーム上のファイル名をNUL文字(スペースではなく)と-0
からxargs
は、入力形式としてそれを期待すべきであることを知らせます。
これを行う別の方法は、find ... -exec ...
次のように:
find . -type f -exec chmod 644 {} \;
問題は、-exec
は、すべてのファイルに対してchmod
プロセスを開始します。 xargs
アプローチはこれを回避し、「パス名のスペース」問題に対処できるfind
およびxargs
のバージョンがあれば優れています。受け入れられた答えを参照してください。
また、レコードについては、chmodeするファイルが多すぎる場合、またはパス名の合計長が大きすぎる場合、バックティックの使用は中断されます。
私の簡潔な2セント...
Linux:
$ chmod 644 `find -type f`
OSX:
$ chmod 644 `find . -type f`
これは、現在のディレクトリとそのすべてのサブディレクトリに含まれるすべてのファイルを再帰的に変更するために機能します。別のディレクトリをターゲットにする場合は、.
正しいパスで:
$ chmod 644 `find /home/my/special/folder -type f`
「find。-type f -print | xargs chmod 444」は動作しませんか?そうでない場合は、を見つけます。 -print> myfile.shおよびvi myfile.shでディレクトリを削除し(あまり多くないはずです)、次に1、$ s/^/chmod 444 /およびsh myfile.shを削除します。
with GNU find
find /path -type f -exec chmod 644 {} +;