現在のディレクトリとすべてのサブディレクトリの一部のファイルの権限を変更するときにスペースを含むファイル名を処理する方法は?

現在のディレクトリとすべてのサブディレクトリの一部のファイルの権限を変更するときにスペースを含むファイル名を処理する方法は?

.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

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

これは、新しいプロセス内の各ファイルに対して別々のコマンドを実行せずに各ファイルのフルパスを2回検索するのを防ぐため、最も効率的です(ファイルの相対パスでシステムコールを呼び出すchmod )。ディレクトリクロール中に見つかります。つまり、そのディレクトリにつながるすべてのパスコンポーネントを再検索する必要はありません。sfindchmod()sfindchmod()

そしてzsh

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

ここではシェルの再帰ワイルドカードを使用しますD. グローバル予選隠しファイルを個別に含め、次に制限します。定期的なファイル(はい-type f)。追加すると、^f[u+rw,go+r]すでにこれらの権限を持つファイルをスキップできます。

globにはchmodsを使用できません。ワイルドカードはと一致せずに-Rシェルによって拡張されるので(シェルがワイルドカード演算子として解釈するには引用符を解除する必要があります)、ファイルのリストをに渡すことができ、その中にあるファイルのディレクトリの場合にのみ可能です。 chmod を再帰的にそのファイルに追加し、その中のすべてのファイルの権限を変更します。chmodchmod -Rv ... *' '*.html*htmlchmod

答え2

「空白のあるファイル名」には、findとが必要ですxargsman find xargs以下を読んで実行してください。

find . -type f -name '*.html' -print0 | \
    xargs -0 -r echo chmod u=rwx,g=r,o

echo効果がある場合は、 ""を削除してください。

関連情報