このディレクトリの内容を考えると:
one.file
two.file
three.file
私が入るとき、bashで
rm *.file !(two)
one.file
とthree.file
のみが削除されます。 ZSHでこれを行うにはどうすればよいですか?
私も答えに興味があり、クイック検索でこれが見つかりました zshでのグロブに関する記事 。ハイライト:
^
_否定として機能します。たとえば、_ls ^two.file
_はone.fileとthree.fileのみをリストします。^
_と_*
_を組み合わせることができます。たとえば、_ls ^two*
_は、「two」で始まらないものをすべてリストします。ls (^two).file
は、が「two」で始まらないもの、およびを一覧表示します。 )doesは "file"で終わります。Ksh構文ls !(two).file
を使用する場合は、zshでKSH_GLOB
オプションをオンにするだけです。
$ setopt KSH_GLOB
$ ls -1 !(two).file
one.file
three.file
ただし、zshは、EXTENDED_GLOB
オプションによってアクティブ化される他の強力なグロブ技術を提供します。完全なリストについては、man zshexpn
のセクションFILENAME GENERATIONをお読みください。質問に最も関連するのは、次の演算子です。
^x
はパターン以外のすべてに一致しますxなので、あなたの場合はls -1 ^two.file
x~y
は、パターンに一致するものすべてに一致するため、より強力ですxが、一致しないyであるため、ls -1 *~two.file
。特別なことは、xに別のグロブパターンを使用できることです。
$ ls -1 *.file~two*
one.file
three.file
これは、^
演算子では不可能です。この場合は*~
と同等です。
$ ls -1 *.file^two*
one.file
three.file
two.file