現在のディレクトリとそのすべてのサブディレクトリ内の特定のファイルの権限を変更するときに、スペースを含むファイル名をどのように処理すればよいですか?

現在のディレクトリとそのすべてのサブディレクトリ内の特定のファイルの権限を変更するときに、スペースを含むファイル名をどのように処理すればよいですか?

.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()sfindchmod()

zsh

chmod -v -- u+rw,go+r **/*' '*.html(D.)

ここではシェルの再帰グロブとDandを使用しています. 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問題がなければ「 」を削除してください。

関連情報