ウェブサイト検索

拡張子の付いた 1 つまたはいくつかのファイルを除いて、ディレクトリ内のすべてのファイルを削除する 3 つの方法


場合によっては、ディレクトリ内のすべてのファイルを削除したり、特定の種類 (特定の拡張子で終わる) のファイルを除くすべてのファイルを削除してディレクトリをクリーンアップしたりする必要がある状況に陥ることがあります。

この記事では、rmfind、および globignore コマンドを使用して、特定のファイル拡張子または種類を除くディレクトリ内のファイルを削除する方法を説明します。

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

推奨読書: Linux で複数のファイル名/拡張子を検索するには find コマンドを使用する

Linux では、シェル パターンは、ワイルドカードまたはメタキャラクターと呼ばれる次の特殊文字で構成される文字列です。

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

ここで検討する考えられる方法は 3 つあり、次のとおりです。

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

さまざまな拡張パターン マッチング演算子を以下に示します。パターン リスト は、| 文字で区切られた 1 つ以上のファイル名を含むリストです。

  1. *(pattern-list) – 指定されたパターンの 0 個以上の出現と一致します。
  2. ?(pattern-list) – 指定されたパターンの 0 回または 1 回の出現と一致します。
  3. +(pattern-list) – 指定されたパターンの 1 つ以上の出現と一致します。
  4. @(pattern-list) – 指定されたパターンのいずれかに一致します
  5. !(pattern-list) – 指定されたパターンの 1 つを除くすべてに一致します

これらを使用するには、次のように extglob シェル オプションを有効にします。

shopt -s extglob

1. ディレクトリ内の filename を除くすべてのファイルを削除するには、次のコマンドを入力します。

rm -v !("filename")

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

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

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

それだけです!同じ目的で他のコマンド ライン テクニックを念頭に置いている場合は、以下のフィードバック セクションを介して共有することを忘れないでください。