回答:
以下を使用できます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 rm
ls | grep -v *.txt | xargs rm
同様に動作します
grep -v *.txt
は、.txt
ファイルが1つしかない場合にのみ機能します。存在しない場合、パターンとしてgrep
使用さ*.txt
れます。複数ある場合、他のすべてのファイル内で最初のファイル名を検索し、.txt
からの出力を無視しますls
。(正確な結果は、シェルのglobオプションに依存する場合があります。)
.txt$
はtxt
、ドットに関係なく末尾が文字列に一致します。なぜならgrep
、正規表現をパラメーターとして使用するからです。したがって、ファイルa.txt
and 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
。