ウェブサイト検索

特定の拡張子を持つファイルを除いて、ディレクトリ内のすべてのファイルを削除する3つの方法


時には、ディレクトリ内のすべてのファイルを削除する必要がある状況に直面したり、特定の拡張子で終わるファイルを除くすべてのファイルを削除してディレクトリを整理する必要があることがあります。

この記事では、rm、find、およびglobignoreコマンドを使用して、特定のファイル拡張子やタイプを除いてディレクトリ内のファイルを削除する方法を示します。

次に進む前に、Linuxの1つの重要な概念であるファイル名パターンマッチングを簡単に見てみましょう。これにより、私たちが直面している問題に対処できるようになります。

お勧めの読書: Linuxで複数のファイル名/拡張子を検索するためのfindコマンドの使用

Linuxでは、シェルパターンは以下の特別な文字から成る文字列で、これらはワイルドカードまたはメタキャラクターと呼ばれます:

  1. * – 0個以上の文字に一致します
  2. ? – 任意の単一文字に一致します
  3. [seq] – seq内の任意の文字に一致します
  4. [!seq] – seqに含まれない任意の文字と一致します

ここでは探求する3つの可能な方法があり、これらには次のものが含まれます:

拡張パターンマッチング演算子を使用してファイルを削除する

異なる拡張パターンマッチング演算子は以下に示されており、pattern-listは一つ以上のファイル名を含むリストで、|文字を使って区切られています:

  1. *(パターンリスト) – 指定されたパターンの0回以上の出現に一致します
  2. ?(パターンリスト) – 指定されたパターンのゼロ回または1回の出現にマッチします
  3. +(パターンリスト) – 指定されたパターンの1回以上の出現に一致します
  4. @(パターンリスト) – 指定されたパターンのいずれかにマッチします
  5. !(パターンリスト) - 指定されたパターンのいずれかを除いて任意のものにマッチします。

それらを使用するには、以下のようにextglobシェルオプションを有効にしてください。

# shopt -s extglob

1. 指定したファイル名を除いて、ディレクトリ内のすべてのファイルを削除するには、以下のコマンドを入力してください:

$ rm -v !("filename")

2. filename1 と filename2 を除くすべてのファイルを削除するには:

$ rm -v !("filename1"|"filename2") 

3. 以下の例は、すべての .zip ファイル以外のすべてのファイルを対話的に削除する方法を示しています:

$ rm -i !(*.zip)

4. 次に、以下のようにして、すべての .zip および .odt ファイルを除くディレクトリ内のすべてのファイルを削除できます。その際、実行している作業を表示します:

$ rm -v !(*.zip|*.odt)

必要なコマンドがすべて揃ったら、次のようにしてextglobシェルオプションをオフにします:

$ shopt -u extglob

Linux findコマンドを使用してファイルを削除する

この方法では、適切なオプションを使用して `find` コマンドを独占的に使用するか、以下の形式のようにパイプラインを使用して `xargs` コマンドと組み合わせて使用できます:

$ find /directory/ -type f -not -name 'PATTERN' -delete
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

5. 次のコマンドは、現在のディレクトリ内の.gzファイル以外のすべてのファイルを削除します:

$ find . -type f -not -name '*.gz'-delete

6. パイプラインとxargsを使用して、上記のケースを次のように修正できます:

$ find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

7. もう1つの例を見てみましょう。以下のコマンドは、現在のディレクトリ内の .gz, .odt, および .jpg ファイルを除いて、すべてのファイルを消去します:

$ find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

BashのGLOBIGNORE変数を使用してファイルを削除する

この最後のアプローチは、しかし、bashでのみ機能します。ここで、GLOBIGNORE変数は、パス名展開によって無視されるコロン区切りのパターンリスト(ファイル名)を格納します。

おすすめの読書: LinuxにおけるGrepコマンドの便利な12の実用例

この方法を使用するには、整理したいディレクトリに移動し、次のようにGLOBIGNORE変数を設定します:

$ cd test
GLOBIGNORE=*.odt:*.iso:*.txt

この場合、.odt、.iso、および.txtファイル以外のすべてのファイルが現在のディレクトリから削除されます。

今、ディレクトリをクリーンアップするためのコマンドを実行してください:

$ rm -v *

その後、GLOBIGNORE 変数をオフにします:

$ unset GLOBIGNORE

注意: 上記のコマンドに使用されているフラグの意味を理解するには、さまざまな例で使用された各コマンドのマニュアルページを参照してください。

これで終わりです!同じ目的のために考えている他のコマンドライン技術があれば、下のフィードバックセクションを通じてぜひ私たちと共有してください。

関連記事: