chmod を使用して、すべてのファイルを再帰的に 664 に変更する必要があります。フォルダーをスキップしたいと思います。こんなことをしようと思っていたのですが
ls -lR | grep ^-r | chmod 664
これは機能しません。chmod にパイプできないためだと思います。これを行う簡単な方法を知っている人はいますか?
ありがとう
答えは良いものですが、ファイルごとに個別のサブプロセスを作成するというfind -exec、通常は無関係な欠点があります。ただし、これは完全に機能し、ファイルの数が非常に多くなった場合にのみパフォーマンスが低下します。を使用すると、ファイル名を大きなグループにまとめてから、そのファイルグループxargsのサブプロセスを実行します。
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これを回避する解決策は次のとおりです。
find . -type f -exec chmod 644 {} +
chmodこれにより、プロセス コマンド ラインで可能な限り多くのファイル名引数がアセンブルされます。find ... | xargs ...アプローチは似ています。受け入れられた回答を参照してください。
記録として、chmod するファイルが多すぎる場合、またはパス名の合計長が長すぎる場合、バックティックの使用は機能しなくなります。
GNU検索で
find /path -type f -exec chmod 644 {} +;
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 を実行します。