
.html
現在、現在のディレクトリとそのすべてのサブディレクトリにある拡張子を持つすべてのファイルを、所有者には読み取りおよび書き込み可能、実行可能、グループやその他のユーザーには読み取りのみ可能 (書き込みや実行は不可) に設定しようとしています。ただし、一部のファイルの名前にスペースが含まれているため、どう対処すればよいかわかりません。
私の最初の試み:
chmod -Rv u+rw,go+r '* *.html'
最初の試みをしたときに、次のメッセージが表示されました。
chmod: cannot access '* *.html': No such file or directory
failed to change mode of '* *.html' from 0000 (---------) to 0000 (---------)
2回目の試み:
find . -type f -name "* *.html" | chmod -Rv u+rw,go+r
find
コマンドの出力を に送信するためにパイプ演算子を追加しましたchmod
。しかし、2 回目の試行では、次の結果になりました。
chmod: missing operand after ‘u+rw,go+r’
試行錯誤しましたが、設定された権限を再帰的に変更するためにファイル名のスペースをどのように処理すればよいのかまだわかりません。この問題に対処する最善の方法は何でしょうか? フィードバックや提案をいただければ幸いです。
答え1
-exec
の述語を使用しますfind
:
find . -name '* *.html' -type f -exec chmod -v u+rw,go+r {} +
(ここでは、rw-r--r--
実行権限のみを追加しています。htmlファイルは一般的に実行されることを意図していないため、実行権限を追加することはあまり意味がありません。を次のよう+
に置き換えます。=
セットこれらの権限を正確に追加するこれらのビットを現在の権限に追加します。
! -perm -u=rw,go=r
の前にを追加して-exec
、(少なくとも)それらの権限がすでにあるファイルをスキップすることもできます。
とともにsfind
の実装find
(これはfind
組み込み関数でもある)シェルbosh
-chmod
) の場合は、述語の後に-chfile
(変更を適用)を使用できます。
sfind . -name '* *.html' -type f -chmod u+rw,go+r -chfile
(すでに適切な権限を持つファイルはスキップされる! -perm...
ため、sfind
を追加する必要はありません)。-chfile
これは、chmod
多数のファイルごとに新しいプロセスで個別のコマンドを実行する必要がないため、最も効率的です。また、すべてのファイルの完全なパスを 2 回検索する必要もありません (ディレクトリを基準としたファイルのパスを使用してシステム コールを呼び出し、sfind
クロール 中にファイルを見つけるため、ファイルにつながるすべてのパス コンポーネントを再度検索する必要がありません)。chmod()
sfind
chmod()
とzsh
:
chmod -v -- u+rw,go+r **/*' '*.html(D.)
ここではシェルの再帰グロブとD
andを使用しています.
glob 修飾子それぞれ隠しファイルを含め、制限する通常ファイル(のように-type f
)^f[u+rw,go+r]
を追加します。すでにそれらの権限を持つファイルもスキップします。
chmod
をglob と組み合わせて使用することはできません-R
。 glob はシェルによって展開され、 によって照合されるわけではないのでchmod
、 を使用する場合はchmod -Rv ... *' '*.html
(*
シェルが glob 演算子として解釈するには、引用符で囲まない必要があることに注意してください)、html
ファイルのリストを に渡すchmod
だけで、それらのファイルのいずれかがディレクトリである場合のみ、 chmod がそれらのディレクトリに再帰的にアクセスし、そこにあるすべてのファイルの権限を変更します。
答え2
「スペースを含むファイル名」にはfind
と が必要ですxargs
。 を読み取りman find xargs
、次のようにします。
find . -type f -name '*.html' -print0 | \
xargs -0 -r echo chmod u=rwx,g=r,o
echo
問題がなければ「 」を削除してください。