75

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

ls -lR | grep ^-r | chmod 664

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

ありがとう

4

5 に答える 5

117

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

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

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

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

これ-print0によりfind、出力ストリームのファイル名が(スペースではなく)NUL文字で終了し、入力形式としてそれを予期する必要があることを通知します-0xargs

于 2009-07-22T06:18:23.240 に答える
33

これを行う別の方法はfind ... -exec ...、次のように使用することです。

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

問題は、非効率的なファイルごとにプロセスを-exec開始することです。chmodこれを回避する解決策は次のとおりです。

find . -type f -exec chmod 644 {} +

chmodこれにより、プロセス コマンド ラインで可能な限り多くのファイル名引数がアセンブルされます。find ... | xargs ...アプローチは似ています。受け入れられた回答を参照してください。

記録として、chmod するファイルが多すぎる場合、またはパス名の合計長が長すぎる場合、バックティックの使用は機能しなくなります。

于 2009-07-22T06:03:20.790 に答える
2

GNU検索で

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

于 2009-07-22T06:49:25.627 に答える
2

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 を実行します。

于 2009-07-22T06:01:12.323 に答える