Linuxターミナルで、1つまたは2つを除いてフォルダーからすべてのファイルを削除するにはどうすればよいですか?
例えば。
1ディレクトリに画像ファイルと1つの.txt
ファイル。それ以外のすべてのファイルを削除したい.txt
ファイル。
ディレクトリ内からファイルを一覧表示し、「保存するファイル」を含まないものをすべて除外し、リストに残っているすべてのファイルを削除します。
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
名を管理します
一般に、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 {} \;
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
not
修飾子を使用して、削除したくないfile(s)
またはpattern(s)
を削除します。1
に渡された-maxdepth
を変更できますファイルを削除するサブディレクトリの深さを指定するには
find . -maxdepth 1 -not -name "*.txt" -exec rm -f {} \;
あなたも行うことができます:
find -maxdepth 1 \! -name "*.txt" -exec rm -f {} \;
Bashでは、以下を使用できます。
$ shopt -s extglob # Enable extended pattern matching features
$ rm !(*.txt) # Delete all files except .txt files