回答:
以下を使用できますfind。
find . -type f ! -name '*.txt' -deleteまたは、bashの拡張グロビング機能:
shopt -s extglob
rm *.!(txt)または、zshで:
setopt extendedglob
rm *~*.txt(.)
#  ||     ^^^ Only plain files
#  ||^^^^^ files ending in ".txt"
#  | \Except
#   \Everything*.!(txt)ない!(*.txt)?
                    rmフォルダがある場合は窒息します。
                    find . -type f ! -name "*.txt" | xargs -r rmは、GNU \ xargsで機能します。BSDおよびUNIXのxargsコマンドに-rがない場合、ローカルを確認する必要がありますman xargs
                    反転grepとxargsを使用できます
ls | grep -v .txt$| xargs rmls | grep -v *.txt | xargs rm同様に動作します
                    grep -v *.txtは、.txtファイルが1つしかない場合にのみ機能します。存在しない場合、パターンとしてgrep使用さ*.txtれます。複数ある場合、他のすべてのファイル内で最初のファイル名を検索し、.txtからの出力を無視しますls。(正確な結果は、シェルのglobオプションに依存する場合があります。)
                    .txt$はtxt、ドットに関係なく末尾が文字列に一致します。なぜならgrep、正規表現をパラメーターとして使用するからです。したがって、ファイルa.txtand aatxtとa-txtはすべてこの式に一致します。正しい表現はでなければなりませんls | grep -v \\.txt$ | xargs --no-run-if-empty rm。好奇心の強い人向け:式で遊んでみたい場合は、このテスト式を安全に使用してls | grep \\.txt$ | xargs --no-run-if-empty echoください(注:-vフラグとがありませんrm=>echo)。注2:二重バックスラッシュに気づいたかもしれません。1つは正規表現、もう1つはbashがスラッシュをエスケープするためです。
                    単に行う:
rm $(ls -I "*.txt" )  #*。txt以外のファイルタイプを削除します
同様に、「1つ以上のファイルタイプを除く」を削除する必要がある場合は、次のようにします。
rm $(ls -I "*.txt" -I "*.pdf" )  #*。txtおよび* .pdfを除くファイルタイプを削除します
-Iオプションは便利かもしれませんが、lsを解析しない理由を見てください。そして何を| xargs達成しますか?引数なしで、echoすべての入力で実行されます。
                    xargsを達成することになっていますか?
                    
lsに、実際にを呼び出そうとする前のように、指定された答えを無害なコマンドでテストしますrm。