Linuxでは、パターン* .txtを除くすべてのファイルを削除するにはどうすればよいですか?


74

私はtxt現在のディレクトリの下にあるすべてのファイルを削除する方法を知っていますrm *.txt。ファイル以外の現在のディレクトリ内のすべてのファイルを削除する方法を知っていtxtますか?


21
いつものようlsに、実際にを呼び出そうとする前のように、指定された答えを無害なコマンドでテストしますrm
-chepner

^この男は危険に暮らすのが好きではない.. :)
jDub9

回答:


111

以下を使用できます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

これらの一部は、フォルダーがあるかどうか、およびフォルダーで何をしたいかによって、調整が必要になる場合があります。
ケビン

1
するべきでは*.!(txt)ない!(*.txt)
LRI

@LauriRantaはフォルダー内の内容に依存しますが、答えはありません。すべてのファイルに拡張子がある場合はそのままで問題ありませんし、rmフォルダがある場合は窒息します。
ケビン

ブラケットに問題があります。bashスクリプトでグロビングスタイルを使用すると、構文エラーとかっこについて文句を言います。ただし、CLIから実行することはできます。
CMCDragonkai 14年

1
@izogfifチェックfind . -type f ! -name "*.txt" | xargs -r rmは、GNU \ xargsで機能します。BSDおよびUNIXのxargsコマンドに-rがない場合、ローカルを確認する必要がありますman xargs
-Ntwobike

10

多くの方法があります。しかし、最も簡単な方法は(bash)です:

shopt -s extglob
rm !(*.txt)

10

「* .txt」以外のすべてのファイルを削除する場合は、次のコマンドを使用できます。

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

ただし、ファイルとともにディレクトリも削除する場合は、これを使用できます。

$ find . ! -name "*.txt" -exec rm -r {} \;


4

なしの1つのソリューションfind

mv dir/*.txt otherdir/
rm -r dir
mv otherdir dir

これはあらゆる種類のシェルで動作するはずです。


3

反転grepとxargsを使用できます

ls | grep -v .txt$| xargs rm

ls | grep -v *.txt | xargs rm同様に動作します
フィリップス

@phillipsk grep -v *.txtは、.txtファイルが1つしかない場合にのみ機能します。存在しない場合、パターンとしてgrep使用さ*.txtれます。複数ある場合、他のすべてのファイル内で最初のファイル名を検索し、.txtからの出力を無視しますls。(正確な結果は、シェルのglobオプションに依存する場合があります。)
JigglyNaga

.txt$txt、ドットに関係なく末尾が文字列に一致します。なぜならgrep、正規表現をパラメーターとして使用するからです。したがって、ファイルa.txtand aatxta-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がスラッシュをエスケープするためです。
ディミトリーK

1

単に行う:

rm $(ls -I "*.txt" ) #*。txt以外のファイルタイプを削除します

同様に、「1つ以上のファイルタイプを除く」を削除する必要がある場合は、次のようにします。

rm $(ls -I "*.txt" -I "*.pdf" ) #*。txtおよび* .pdfを除くファイルタイプを削除します


StackExchangeへようこそ!この-Iオプションは便利かもしれませんが、lsを解析しない理由を見てください。そして何を| xargs達成しますか?引数なしで、echoすべての入力で実行されます。
-JigglyNaga

xargsを達成することになっていますか?
ダグ

おかげで、xargsは上記のケースでは役に立ちませんでしたが、現在修正されています。
スーリヤ

0

これは、指定されたもの()を除くすべての隠し(ドット)ファイルおよびフォルダーを削除するためにも機能します.mydir

rm -rf $(ls -aI ".mydir")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.