1種類(またはそれ以上)のファイルタイプを除くすべてを削除する


20

フォルダー内のすべてのファイルを削除するコマンドを見つけようとしましたが、ファイルタイプの種類は探していませんでした。しかし、私は運がないようです。私が今までに試したこと:

set extended_glob
rm !(*.dmg)
# this returns zsh:number expected

rm ./^*.dmg
# this returns no matches found 

私が使用しているzshのバージョンはですzsh 5.0.2 (x86_64-apple-darwin13.0.1)

回答:


22

このextended_globオプションは、zsh独自の拡張glob構文を提供します

setopt extended_glob
rm -- ^*.dmg
rm -- ^*.(dmg|txt)

ksh_globオプションを設定してksh globを取得できます。ネガティブパターンが単語の最後のものである一般的なケースでは、zshはかっこをglob修飾子として解析する場合があることに注意してください(kshエミュレーションモードではこれを行いません)。

setopt ksh_glob
rm -- !(*.dmg|*.txt)
setopt no_bare_glob_qual
rm -- !(*.dmg)

これはうまくいかないようです。私は実行するとrm -r secrets/!(directory)、それが求め続けnumber expectedたり、時にはそれが私に与えますevent not found: directory
CMCDragonkai

@CMCDragonkai「number expected」は、ksh_globオプションを設定しなかったことを示します。「イベントが見つかりません:ディレクトリ」は、bashを実行していることを示します(これも!(…)構文を理解しますが、後にのみshopt -s extglob)。
ジル 'SO-悪であるのをやめる' 14年

zshシェルでbashを実行するにはどうすればよいですか?
CMCDragonkai 14年

私にとっては、setopt ksh_glob; echo !(a|b)動作setopt ksh_glob; echo !(a)しない間(「期待される数」)...
ThiefMaster

@ThiefMaster私は同じ問題を抱えていました。バグですか?
CodeTower

5

findシェルの代わりに使用できます:

find . -mindepth 1 -maxdepth 1 ! -name "*.dmg" -delete

からman find

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.
   -name pattern
          Base of file name (the path with the leading directories removed)
          matches shell pattern pattern. 
   -delete
          Delete  files; true if removal succeeded.  If the removal failed,
          an error message is issued.  If -delete fails, find's exit status
          will be nonzero (when  it eventually exits).  Use of -delete 
          automatically turns on the -depth option.

find何らかの理由で使用できない場合は、ここでzsh(または他のシェル)でそれを行う方法があります。zshされzsh、これを行う簡単な方法は、おそらくありますが、私は以来、bash男は、これは私が思い付いたものです:

for file in *; do if [[ ! "$file" == *.dmg ]]; then rm $file; fi; done

残念ながら、Macでfindを使用するたびに、通知なしで現在のzshセッションが終了します。同じ問題がありますか?find [Process completed]
ズングエン

1
@nXqdは、なしでそれを行う方法についての更新された回答を参照してくださいfindfindただし、発生しないはずの問題について質問を投稿することをお勧めします。その場合、の出力を含めますtype -a find
テルドン

1
でもbashで、簡単な解決策があります:rm !(*.dmg)、後shopt -s extglob
ジル「SO-悪であるのをやめる」

@terdonシェルでのデバッグのヒントをありがとう。その出力は正しいようです:find is a shell function find is /usr/bin/find
ズングエン

@nXqdは正しくありません。シェル関数であってはなりません/usr/bin/findfindbash構成ファイルの1つで定義された関数が定義されています。OSXを使用しているので、おそらくになり~/.profileます。
テルドン

3

ファイルを削除するもう1つの方法はfindxargsとを使用することですrm

find . -mindepth 1 -maxdepth 1 ! -name '*.dmg' -print0 | xargs -0 rm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.