ZSH Globbing 構文の説明

ZSH Globbing 構文の説明

フォルダdotfilesのすべての内容を~gitリポジトリにコピーしてバックアップしたいのですがZSH

うまくいくような次のコマンドが見つかりました。

cp -a ~/.[^.]* .決勝戦はどこですか? gitディレクトリです。

私はこれがどのように機能するのか理解していません。誰かが私にガイドを提供したり、詳細については、Googleに何を探すべきかを教えてもらえますか?

頑張ったZSH + [^] + globbing

答え1

この構文は一部のシェルで動作します。その他そこでもzshそれは間違っています。

.[^.]*文字以外のゼロ個以上の文字が、次の.ファイル名と一致します。.

.これは..拡張子を含むシェルに必要な構文です.*

...現在のディレクトリと親ディレクトリをそれぞれ参照するためのナビゲーションツールです。 globは実際のファイルリストを生成するツールなので、glob拡張には使用できません。それにもかかわらず、歴史的に、シェルは報告されているように、グローバル拡張にこれを含めましたreaddir()

zsh、Forsythシェルとその子孫(pdksh、mksh、OpenBSD sh ...)、またはシェルはfish問題を解決し、結果に.Norを含めません。..ファイル名の生成²、次のグローバル変数の場合でも:

$ echo (.|..)
zsh: no matches found: (.|..)

のようなものを失うので、一般的な場合でも間違っています..foobar

また、[^.]多くのシェルがこれをサポートしていますが、標準のPOSIX構文ではありません。

POSIXsh構文には次のものが必要です。

cp -a ~/.[!.]* ~/..?* .

..?*(一致するものを追加して..から一つ上記のファイル名タイプを含む文字数以上..foobar)。

zsh(および上記の他のシェル)には、次のものが必要です。

cp -a ~/.* .

希望、結局、POSIXではshに対して許可/推奨されます。我々は、他の多くの殻が続くのを見るでしょう。


1 歴史的記録と伝説によると、.名前が次のように始まるファイルの概念は次のとおりです。隠された1970年代、このユーティリティの初期バージョンのバグが原因で発生し、その結果、lsすべてのファイル名が 。このバグは、人々がファイルを隠すためにこのバグに依存し始めたときに機能しました。....

² Bashはglobskipdotsバージョン5.2でオプションを追加しました。

答え2

部分に分けてみましょう。

  • cp -a:すべて~/.[^.]*のコンテンツとその下のディレクトリを「サブディレクトリもコピーし、ファイルとディレクトリのすべてのプロパティを同じにしてください」と言った場所にコピーします.
    -a追加man cp情報
  • ~/.[^.]*:次の理由でホームディレクトリ内のすべての隠しファイルとディレクトリ:
    • ~あなたのホームディレクトリは何ですか?
    • *「これは何でも構いません」という意味なので、~/*次のようになります。ホームディレクトリ内のすべてのファイル/ディレクトリ
    • ~/.*次のようになります。ホームディレクトリ内のドットで始まるすべてのファイル。一見すると、これは「すべての隠しファイルとディレクトリ」と同じように見えますが、ディレクトリ.(現在のディレクトリ)と..(親ディレクトリ)もあり、望ましくないのでそうではありません。
    • [^.]「theを除くすべての可能な文字を意味するため、.and」の問題は解決されます。...

したがって、全体的にこのコマンドは次のことを意味します。ホームディレクトリのすべての隠しファイルとディレクトリを現在のディレクトリにコピーします。

関連情報