.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
)。ディレクトリクロール中に見つかります。つまり、そのディレクトリにつながるすべてのパスコンポーネントを再検索する必要はありません。sfind
chmod()
sfind
chmod()
そしてzsh
:
chmod -v -- u+rw,go+r **/*' '*.html(D.)
ここではシェルの再帰ワイルドカードを使用しますD
。.
グローバル予選隠しファイルを個別に含め、次に制限します。定期的なファイル(はい-type f
)。追加すると、^f[u+rw,go+r]
すでにこれらの権限を持つファイルをスキップできます。
globにはchmod
sを使用できません。ワイルドカードはと一致せずに-R
シェルによって拡張されるので(シェルがワイルドカード演算子として解釈するには引用符を解除する必要があります)、ファイルのリストをに渡すことができ、その中にあるファイルのディレクトリの場合にのみ可能です。 chmod を再帰的にそのファイルに追加し、その中のすべてのファイルの権限を変更します。chmod
chmod -Rv ... *' '*.html
*
html
chmod
答え2
「空白のあるファイル名」には、find
とが必要ですxargs
。man find xargs
以下を読んで実行してください。
find . -type f -name '*.html' -print0 | \
xargs -0 -r echo chmod u=rwx,g=r,o
echo
効果がある場合は、 ""を削除してください。