一部を除くディレクトリ内のすべてのファイルを削除する
1. 概要
Bashターミナルでファイルを削除することは、特にファイルをターゲットにする方法がわからない場合は、非常に困難な作業になる可能性があります。 これと同じ理由で、アクションについて完全に確信が持てない限り、通常、複数のサブディレクトリにまたがってファイルを削除するよりも、ディレクトリごとにファイルを削除する方が適切です。
このチュートリアルでは、まだ必要なファイルを除いて、ディレクトリ内のすべてのファイルを削除する3つの優れた方法を見てみましょう。
2. findコマンドの使用
find を使用すると、 -not などのオプションを使用して、削除しないファイルを指定したり、 -delete オプションを使用して、残りのファイルの削除を呼び出すことができます。ディレクトリ内のファイル:
find [path to directory] -type f -not -name [filename or extension] -delete
たとえば、 file1.jpg 、 file2.png 、 file3.pdf 、を除くテストディレクトリ内のすべてのファイルを削除する方法を見てみましょう。 file4.zip :
$ ls
'file1 (another copy).jpg' 'file3 (another copy).pdf'
'file1 (copy).jpg' 'file3 (copy).pdf'
file1.jpg file3.pdf
'file2 (another copy).png' 'file4 (another copy).zip'
'file2 (copy).png' 'file4 (copy).zip'
file2.png file4.zip
$
find . -type f -not \( -name 'file1.jpg' -or -name 'file2.png' -or -name 'file3.pdf' -or -name 'file4.zip' \) -delete
次に、テストディレクトリの内容を一覧表示します。
$ ls
file1.jpg file2.png file3.pdf file4.zip
上記のfindコマンドを使用して除外したファイルは、引き続きディレクトリに含まれています。
3. 拡張グロブおよびパターンマッチング演算子の使用
拡張globbingは、extglobとも呼ばれます。 extglob を有効にすると、rmコマンドの有効性を高めるために使用できるパターンマッチング演算子がアクティブになります。 また、!演算子を使用すると、削除時にglobを一致させたくないすべてのファイルを除外できます。
パターンマッチング演算子のリストを見てみましょう。
- ?(pattern-list)は、少なくとも0回、最大で1回一致します
- *(pattern-list)は、0、1、または複数のオカレンスに一致します
- +(pattern-list)は1つまたは複数のオカレンスに一致します
- @(pattern-list)は1つのパターンオカレンスに一致します
- !(pattern-list)は、指定されたパターンをマッチングから除外します
特定のBashセッションでextglobを有効にするには、shopt組み込みを使用できます。
$ shopt -s extglob
この後、
$ rm -v !("[file]")
テストディレクトリfile1.jpg、 file2.png 、 file3.pdf 、およびfile4.zipの内容を更新しましょう。
$ ls
'file1 (3rd copy).jpg' 'file3 (3rd copy).pdf'
'file1 (another copy).jpg' 'file3 (another copy).pdf'
'file1 (copy).jpg' 'file3 (copy).pdf'
file1.jpg file3.pdf
'file2 (3rd copy).png' 'file4 (3rd copy).zip'
'file2 (another copy).png' 'file4 (another copy).zip'
'file2 (copy).png' 'file4 (copy).zip'
file2.png file4.zip
複数のファイルまたはファイル拡張子を削除から除外するには、パイプとも呼ばれる| を使用して、それらを分離します。
$ rm -v !("file1.jpg"|"file2.png"|"file3.pdf"|"file4.zip")
removed 'file1 (3rd copy).jpg'
removed 'file1 (another copy).jpg'
removed 'file1 (copy).jpg'
removed 'file2 (3rd copy).png'
removed 'file2 (another copy).png'
removed 'file2 (copy).png'
removed 'file3 (3rd copy).pdf'
removed 'file3 (another copy).pdf'
removed 'file3 (copy).pdf'
removed 'file4 (3rd copy).zip'
removed 'file4 (another copy).zip'
removed 'file4 (copy).zip'
ただし、拡張グロブを使用しない場合は、通常、無効にすることをお勧めします。
$ shopt -u extglob
最後に、 extglob を使用して、.pngなどのファイルタイプを使用してファイルを除外できます。
$ rm !(*.png)
その結果、上記のコードスニペットは、.pngファイルタイプのファイルを除くディレクトリ内のすべてのファイルを削除します。
4. Bash GLOBIGNORE変数の使用
GLOBIGNOREは、globが一致してはならないデータまたはパターンを指定します。
削除から除外したいファイルでGLOBIGNORE変数を設定しましょう。
$ GLOBIGNORE=file1.jpg:file2.png:file3.pdf:file4.zip
前のセクションと同等のディレクトリ構造で、次のコマンドはGLOBIGNORE変数に設定されたファイルを除くすべてのファイルを削除します。
$ rm -v *
removed 'file1 (3rd copy).jpg'
removed 'file1 (another copy).jpg'
removed 'file1 (copy).jpg'
removed 'file2 (3rd copy).png'
removed 'file2 (another copy).png'
removed 'file2 (copy).png'
removed 'file3 (3rd copy).pdf'
removed 'file3 (another copy).pdf'
removed 'file3 (copy).pdf'
removed 'file4 (3rd copy).zip'
removed 'file4 (another copy).zip'
removed 'file4 (copy).zip'
最も重要なことは、GLOBIGNOREの設定を解除できることです。
$ unset GLOBIGNORE
GLOBIGNORE は、指定されたファイルをパターンマッチングから除外したままにするため、これは良い習慣です。 同様に、除外に気付いていない場合、実行するコマンドがすべてのファイルに影響を与えるとは限らないため、イライラして解決が困難になる可能性があります。
ただし、 GLOBIGNORE を設定する場合は、Bash固有の機能を使用します。 したがって、
5. 結論
この記事では、必要なファイルを保持したまま、ディレクトリ内のファイルを削除する3つの方法について説明しました。