web-dev-qa-db-ja.com

Linuxターミナルで、1つまたは2つを除くディレクトリ内のすべてのファイルを削除する方法

Linuxターミナルで、1つまたは2つを除いてフォルダーからすべてのファイルを削除するにはどうすればよいですか?

例えば。

1ディレクトリに画像ファイルと1つの.txtファイル。それ以外のすべてのファイルを削除したい.txtファイル。

14
Bilal

ディレクトリ内からファイルを一覧表示し、「保存するファイル」を含まないものをすべて除外し、リストに残っているすべてのファイルを削除します。

ls | grep -v 'file-to-keep' | xargs rm

ファイル名にスペースが含まれる問題を回避するには(ファイル名にスペースを使用しないでください)、findおよび-0オプションを使用します。

find 'path' -maxdepth 1 -not -name 'file-to-keep' -print0 | xargs -0 rm

または両方を組み合わせて、grepオプション-zを使用して、findからの-print0名を管理します

31
Didier Trosset

一般に、grepで反転パターン検索を使用するとうまくいきます。パターンを定義しなかったので、一般的なコード例を示します。

ls -1 | grep -v 'name_of_file_to_keep.txt' | xargs rm -f

ls -1は1行に1つのファイルをリストするため、grepは1行ずつ検索できます。 grep -vは反転フラグです。したがって、一致したパターンは削除されません。

複数のファイルの場合、egrepを使用できます。

ls -1 | grep -E -v 'not_file1.txt|not_file2.txt' | xargs rm -f

質問が更新された後の更新:.txtで終わらない、現在のフォルダー内のファイルを除くすべてのファイルを削除しても構わないと思います。だからこれもうまくいくはずです:

find . -maxdepth 1 -type f -not -name "*.txt" -exec rm -f {} \;
8

findは-deleteオプションをサポートしているため、-execを使用する必要はありません。 -not -name somefile -not -name otherfileの複数のセットを渡すこともできます

user@Host$ ls
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt josh.pdf keepme

user@Host$ find . -maxdepth 1 -type f -not -name keepme -not -name 8.txt -delete

user@Host$ ls
8.txt  keepme
4
Josh J

not修飾子を使用して、削除したくないfile(s)またはpattern(s)を削除します。1に渡された-maxdepthを変更できますファイルを削除するサブディレクトリの深さを指定するには

find . -maxdepth 1 -not -name "*.txt" -exec rm -f {} \;

あなたも行うことができます:

find  -maxdepth 1 \! -name "*.txt" -exec rm -f {} \;
3
bjhaid

Bashでは、以下を使用できます。

$ shopt -s extglob  # Enable extended pattern matching features    
$ rm !(*.txt)       # Delete all files except .txt files
2
Eugene Yarmash