".[^.]*" または ".??*" グローバルパターンを正確にいつ使用しますか?

私はLinuxとLinuxのコマンドラインと次の文を理解しようとしています。

(現在のディレクトリと親ディレクトリ)が.*一致すると、グローバルな問題が発生する可能性があります。または、同じパターンを使用してすべてのドットファイルをインポートできます。....[^.]*.??*とは別に現在のディレクトリと親ディレクトリです。

.[^.]*正確にいつ(どのコマンドで)またはを使用しますか.??*

ベストアンサー1

これは、Forsythシェル(および派生物を含む)以外のシェルでバグ/不正な機能を解決するためのものですzsh。ここでglobの拡張には、(残念ながらそれを返すシステムで)が含まれます。fishpdksh.*...readdir()

この殻で、

chmod -R og-rwx .*

たとえば、rwx権限は、現在のディレクトリの隠しファイルとディレクトリだけでなく、現在の()ディレクトリと.親()ディレクトリに対しても繰り返し削除されます。..

ls .*これは、再帰的に操作を実行したり、chown -R .*などのディレクトリで動作するコマンドにfind .*特に悪いです。しかし、他のほとんどのコマンドにはまだ迷惑なので、これらのコマンドを含めたいgrep -r blah .*コマンドは思い出されません。ファイルリストからコマンドを渡します。...

rmユーティリティに安全装置を追加する必要があります。あまりにも多くの人がぶら下がっているので、このバグを修正してくださいrm -rf .*

追加すると、すべてのファイル(隠されているかどうかにかかわらず)をcommand()*に引数として渡すためにも使用されます。cmd -- .[!.]* ..?* *シェルによって異なる解決策を見つけることができます。

glob .[^.]*.[!.]*Bourne / POSIXシェルでは)は.(少なくとも2文字のファイル名と一致するため)と..(2番目の文字が.一致しないため)を除外しますが、2番目のglobを必要とする[^.]ファイルも除外します。..foo..?*

これら...ディレクトリ巡回のためのツールであり、通常のファイルのようにリストするのは間違いです。 POSIXでは、パスコンポーネント(例open("."):、)で理解する必要がありますstat("foo/../bar")が、必ずしもディレクトリエントリとして実装されたり含まれたりする必要はありませんreaddir()

getdents()それにもかかわらず、ほとんどのシステムはまだ初期のUnicesのようにハードリンクを実装しており、ほとんどのシステムは/出力からそのエントリを偽造しませんreaddir()

の場合、bash別の方法はオプションをオンにしてdotglob次を使用することです。

chmod -R og-rwx [.]*

(ただし、隠しファイルでない場合/動作を[.]*模倣するオプションがないと、ファイルの権限が変更される可能性があります。)failglobzshfish

記録によると、.隠しファイルで始まるファイル名は次のようになります。誰かがスキップしようとしたコーディングエラーのために誕生しました...。皮肉なことに、隠しファイルで操作を実行しようとすると同じ問題が発生します。


¹ globskipdotsbash 5.2+のオプションも参照してください

おすすめ記事