1つのファイルのみを残してすべてをコピーするには:私は通常式!(noThisFile)
(passable shopt -s extglob
)を使用します。
現在の場合、私が避けたいのは.git
ディレクトリです。驚いたことに、私は次のことを試しました。
cp -r !(.git) my-target-dir
../
ただし、これもディレクトリの内容を完全にコピーします。
実は私がいつ
echo !(.git)
出力は次から始まります。
. .. myDir myDir2 myFile myFile2
を使用してコピーするとき、そのような問題があったことを覚えていません。ファイル名を確認すると、出力には!(notthisfile)
何もありません。.
..
!(.avoidingDir)
私のシステムがと両方を返すの.
は正しいですか..
?- それが正しい場合、この問題を回避するにはどうすればよいですか?
ベストアンサー1
実際にはかなり興味深いです。 Bash 4.4では、このパターンがdotglob
適用されない場合でも、ドットファイルに拡張するためにこのパターンを使用しているようです。おそらく、パターンの先行が否定的な.
内側にあっても、それを取得するのに十分です。
これが正しいかどうかをBash開発者に連絡する必要があります。 Bash 5.0ではそうではないので、おそらくこれをしてはいけません。 (ただし、設定すると、およびをdotglob
含むすべてのドットファイルを引き続き取得できます。).
..
.git
、andを.
除くすべてを取得するには、andを..
明示的に無視するようにパターンを拡張できます。つまり、隠しandを使用できます。.
..
!(.git|.|..)
GLOBIGNORE
.
..
$ mkdir .git .dot dir
$ echo !(.git|.|..)
dir .dot
$ GLOBIGNORE=.:..
$ echo !(.git)
dir .dot
GLOBIGNORE
(null以外の値に設定するとsumは無視さ.
れますが、..
作る dotglob
.)
または、ドットファイルを表示したくない場合は、そのdotglob
ファイルが無効になっていることを確認してから、*
明示的な除外なしでを使用してください.git
。
$ unset GLOBIGNORE
$ shopt -u dotglob
$ echo *
dir
Zshも.
setを..
使用している場合でもglobdots
kshスタイルを使用するか、または!(.git)
Zsh自体^.git
または*~.git
。