web-dev-qa-db-ja.com

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

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

_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)です。

20
Dzung Nguyen

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

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

ksh_glob 取得するオプション ksh globs 。否定的なパターンがWordの最後のものである一般的なケースでは、zshが 括弧をグロブ修飾子として解析する であることに注意してください(kshエミュレーションモードではこれを行いません)。

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

シェルの代わりに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(または他のシェル)を使用してこれを行う方法を次に示します。 zshzshなので、おそらくもっと簡単な方法がありますが、私はbashの人なので、これは私が思いついたものです。

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

ファイルを削除する別の方法は、findxargsおよびrmを使用することです。

find . -mindepth 1 -maxdepth 1 ! -name '*.dmg' -print0 | xargs -0 rm
3
Dragos Rizescu