`command.*` は親ディレクトリで動作します。

`command.*` は親ディレクトリで動作します。

私たちのチームの誰かがユーザーのホームディレクトリ内のすべての隠しディレクトリに対するユーザー権限を繰り返し変更しようとしています。この目的のために、彼は次のコマンドを実行しました。

cd /home/username
chown -R username:groupname .*

私たちは、彼が実際に/ home内のすべてのユーザーディレクトリの権限を繰り返し変更したことを知って非常に驚きました。なぜならやはり.*同じだからです。..Linuxでこれらの動作を期待しましたか?

答え1

.*を使って何かをしようとすると、いつもやけどをして、ずっと前に文字クラスを使うように切り替えました。

chown -R username.groupname .[A-Za-z]*

それが私がすることです。

編集:誰かが例えばドットファイルを取得できないと指摘しました._Library。たとえば、使用するすべての文字クラスをキャプチャすることは次のとおりです。

chown -R username.groupname .[A-Za-z0-9_-]*

答え2

拡張ワイルドカード(shopt -s extglob)を使用して、以下を使用できます。

.!(.|)

つまり、ドットがないか、ドットの後に何もありません。

答え3

.その文字はファイル名の最初の文字であり、ワイルドカードと一致する場合にのみワイルドカード一致から除外されます。パターンで.*は、 で始まり、含まれる*文字列と一致します(同様に空の文字列と一致します)。これは、迷惑なパターンマッチングルールの直接的な結果です。..*...*

.例外を作成し、一致から体系的に除外するのは合理的です..が、歴史的に実行された方法ではありません。多くのBourne / POSIXシェル(sh、、、、AT&Tなど)に(t)cshと同様dashにこれを含めます。魚も1。一部のシェルはすべてのワイルドカードマッチングから除外されます:zsh、pdksh/posh/mksh(AT&T kshとは異なります)、fishbashkshyash...≥2.0

GLOBIGNOREnull以外の値に設定されている場合強く打つ一致から.合計を除外するのに便利ですが、非標準の動作に切り替えます。..この設定はGLOBIGNOREまた、ドットファイル除外動作をオフにします。を使用すると、GLOBIGNORE='.*'ドットファイルを除外する一般的な動作が得られますが、OR以外のドットファイルとのみ一致します。 (or)を設定すると、ドットファイルを含むすべてのファイルと一致しますが、除外されます。./*./.*...GLOBIGNORE=.:..GLOBIGNORE=../*...

ksh93は、FIGNORE='@(.|..)'一致するファイルからドットファイルを除いて.含めるように設定します。..したがって、.*ドットファイルに拡張されますが、.または..

シェル固有の機能を使用せずに、次の2つのglobを使用してドットファイルを一致させることができます。

.[!.]* ..?*

.そして、次の3つのグローブを持つすべてのファイル(および除く):..

..?* .[!.]* *

ただし、1つ以上のglobがファイルと一致しない可能性があるため、注意してください。これにより、そのパターンは拡張されていないままになります。

驚きを避けるには、使用する方が簡単かもしれませんfindfind(シンボリックリンクに従うよう指示がない限り)絶対親ディレクトリに再帰しないでください。

find /home/username/. -name . -o -prune -name '.*' -exec chown -R username:groupname {} +

答え4

find-maxdepthPOSIXではなく拡張ですが、Linuxでは簡単に動作します)使用を検討してください。

find . -maxdepth 1 -type d -name '.*' -exec chown -R user:group {} +

関連情報