GNU/Linux >> Linux の 問題 >  >> Linux

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

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

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

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

推奨される読み物: Linuxで複数のファイル名/拡張機能を検索するにはfindコマンドを使用します

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

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

ここで検討する方法は3つあり、その中には次のものがあります。

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

さまざまな拡張パターンマッチング演算子を以下に示します。ここで、 pattern-list |を使用して区切られた1つ以上のファイル名を含むリストです キャラクター:

  1. *(pattern-list) –指定されたパターンの0回以上の出現に一致します
  2. ?(pattern-list) –指定されたパターンの0回または1回の出現に一致します
  3. +(パターンリスト) –指定されたパターンの1つ以上のオカレンスに一致します
  4. @(pattern-list) –指定されたパターンの1つに一致します
  5. !(pattern-list) –指定されたパターンの1つを除くすべてに一致します

それらを使用するには、 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

Linuxfindコマンドを使用してファイルを削除

この方法では、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

BashGLOBIGNORE変数を使用してファイルを削除する

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

推奨される読み物: LinuxでのGrepコマンドに関する12の実用的な例

この方法を使用するには、クリーンアップするディレクトリに移動してから、 GLOBIGNOREを設定します。 次のように変数:

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

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

次に、コマンドを実行してディレクトリをクリーンアップします。

$ rm -v *

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

$ unset GLOBIGNORE

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

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


Linux
  1. Linuxで1つの特定のファイルを除いてフォルダ内のすべてのファイルを削除する方法

  2. 1つのファイルを除くすべてのファイル/ディレクトリを削除しますか?

  3. ディレクトリ付きの猫ファイル?

  1. Sed:最初の文字列を除く文字列のすべての出現を削除しますか?

  2. 検索で特定のサブディレクトリを除くすべてのファイルを削除しますか?

  3. 特定のフォルダ内の特定の拡張子を持つすべてのファイルを削除するにはどうすればよいですか?

  1. 最後のログファイル(アルファベット順)を除く古いログファイルを削除しますか?

  2. 検索を使用して特定のディレクトリを検索し、1つのディレクトリを除くその中のすべてのファイルを削除しますか?

  3. bashスクリプトで最新の3つを除くすべてのファイルを削除します