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つの方法について説明しました。