*
シェルによって展開されるグロブです。デフォルトでは、シェルは.
、先頭.
が文字どおりに入力されない限り、名前が(隠しファイルまたはドットファイルと呼ばれる)で始まるファイルを含みません。
*
or [.]*
または?*
or *.*
またはdir/*
dotfilesは含まれません。
.*
またはdir/.*
意志。
だからあなたはできる:
mv -- * .* /dest/
しかし含む一部のシェルbash
(ただしzsh
、mksh
やはfish
の拡張があること)が設計ミスを持っている.*
含ま.
そして..
あなたは(私はそれ設計ミスと呼んでいる含めるグロブをしたいし、一般的には決して)ここではしたくない特別なディレクトリエントリを、。
そのため、(ボーンのようなシェルで)時々人々が使用することがわかります:
mv -- * .[!.]* ..?* /dest/
これは3つのグロブで、最初のファイルは非表示でないファイルに一致し、2番目のファイル名はファイル名で始まり、.
その後に以外の文字が続き.
、3番目のファイル名はファイル名で始まり..
、少なくとも1文字が続きます。
しかし、いくつかの現代のシェルはそれを回避するより良い方法があります
zsh
ではzsh
、(D)
グロブ修飾子を使用して、グロブにドットファイルを含めるように指定できます。
mv -- *(D) /dest/
zsh
また、パターンが一致しない場合、mv
コマンドが実行されないというBourneシェルのその他の誤った機能も修正しました。
上記のように、それは.
また..
そのグロブを含むことも決してしないので、
mv -- * .* /dest/
安全になります。ただし、一致するファイルがない*
か、一致するファイルがない場合.*
、コマンドは中止されるため、次のように使用することをお勧めします。
mv -- (*|.*) /dest/
他のいくつかのシェルと同様に、すべてのグロブにドットファイルを含めるように強制することもできます(たとえば、ドットファイルをより頻繁に含めたい場合):
setopt dotglob
または:
set -o dotglob
その後、特定のグロブにドットファイルを含めないようにするには、次のように記述します。
echo *(^D)
または:
echo [^.]*
バッシュ
残念ながら、bash
glob修飾子はありません。したがって、dotfileをグローバルに含めることができます。ではbash
、構文は次のとおりです。
shopt -s dotglob
(そして[^.]*
隠しファイルのないグロブに使用します)。
ではdotglob
、bash
含まれていない.
も..
のような塊で*
、まだのような塊のために行います.*
。
あなたが設定されている場合GLOBIGNORE
、空でない何かに変数を、それが自動的に有効にdotglob
オプションと除外は.
して..
から.*
グロブではなくからdir/.*
か、.*/file
もの(!)という安全策はかなり無駄ですので。できますGLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'
が、*/.
or ./*
やのようなグロブが壊れ../*
ます。
より良い仕事は周りに使用することです[.]*
か、dir/[.]*
または[.]*/file
(でdotglob
有効)を除き、ドットファイルを展開する.
と..
。
魚
fish
グロブには、.
も含まれません..
。バージョンに応じて、一致しない場合はzsh
(またはbash -o failglob
)またはのいずれかと同様に機能しますbash -o nullglob
。
mv -- * .* /dest/
隠しファイルと非隠しファイルの両方がある場合に機能します。それ以外の場合、YMMVおよび一部のバージョンでは、mv -- /dest
ファイルがまったくない場合に呼び出されることがあります。
ksh93
ksh93
どちらにもグロブ修飾子はありません。以下を使用して、ドットファイルをグロブに含めることができます。
FIGNORE='@(.|..)'
反しbash
さんGLOBIGNORE
も適切に行われています、の問題修正.*
を含む.
とします..
。
ヤシュ
yash
dot-glob
オプション(set -o dot-glob
)がありますが、とは逆にbash
、グロブ拡張(の場合でも*
)が含まれ.
ている..
ため、ほとんど役に立ちません。
tcsh
set globdot
以下のような作品はbash
、つまりは*
除くドットファイルが含ま.
とし..
たが.*
、まだ含ん.
と..
(あなたが使用できる[.]*
以外に隠されたファイルを展開する.
と..
)。