web-dev-qa-db-ja.com

ZSHを使用してコマンドからファイルを除外するにはどうすればよいですか?

このディレクトリの内容を考えると:

one.file
two.file
three.file

私が入るとき、bashで

rm *.file !(two)

one.filethree.fileのみが削除されます。 ZSHでこれを行うにはどうすればよいですか?

5
yPhil

私も答えに興味があり、クイック検索でこれが見つかりました zshでのグロブに関する記事 。ハイライト:

  • _^_否定として機能します。たとえば、_ls ^two.file_はone.fileとthree.fileのみをリストします。
  • _^_と_*_を組み合わせることができます。たとえば、_ls ^two*_は、「two」で始まらないものをすべてリストします。
  • 括弧を使用して、より複雑な一致を作成できます。たとえば、ls (^two).fileは、が「two」で始まらないもの、およびを一覧表示します。 )doesは "file"で終わります。
8
eToThePiIPower

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
    
3
mpy