場合によっては、ディレクトリ内のすべてのファイルを削除したり、一部の指定された種類 (指定された拡張子で終わる) を除くファイルを削除してディレクトリをクリーンアップする必要がある状況に遭遇することがあります。
この記事では、指定されたファイル拡張子を除くディレクトリ内のファイルを削除する方法、または rm、find、および globignore コマンドを使用して入力する方法を説明します。
先に進む前に、Linux の重要な概念である、当面の問題を解決できるファイル名パターン マッチングについて簡単に見てみましょう。
Linux では、シェル パターンは、ワイルドカードまたはメタ文字と呼ばれる次の特殊文字を含む文字列です:
* – 0 個以上の文字と一致します
? – 任意の 1 文字と一致します
[sequence] – 文字列内の任意の文字と一致します。シーケンス
[!sequence] – シーケンスにない任意の文字と一致します
ここでは、次の 3 つの可能なアプローチを検討します:
拡張パターン マッチング演算子を使用してファイルを削除する
さまざまな拡張パターン マッチング演算子を以下に示します。リストは、| で区切られた 1 つ以上のファイル名を含むリストです:
* (パターン リスト) – 指定されたパターンの 0 個以上の出現と一致します
?(パターン リスト) – 指定されたパターンの 0 または 1 つの出現と一致します
@(パターン リスト) – 指定されたパターンの 1 つ以上の一致と一致します
!(パターン リスト) – 指定された 1 つのパターンを除く一致と一致します
これらを使用するには、次のように extglob シェル オプションをオンにする必要があります:
# shopt -s extglob
1. 次のコマンドを入力して、ディレクトリ内の filename を除くすべてのファイルを削除します
$ rm -v !("filename")Linux では、filename1 と filename2 を除くすべてのファイルを削除します
$ rm -v !("filename1"|"filename2")
2.
Linux で一部のファイルを除くすべてのファイルを削除します
3. 次の例は、対話型モードで一部のファイルを除くすべてのファイルを削除する方法を示しています。次に、次の方法でディレクトリ内の .zip と .odt を除くすべてのファイルを削除できます。 ファイル内のすべてのファイルを削除するときに、削除されるファイルを表示します:$ rm -i !(*.zip)
指定されたファイル拡張子を除くすべてのファイルを削除します
必要なコマンドをすべて実行したら、次の方法を使用することもできます。 extglob シェル オプションをオフにします。$ rm -v !(*.zip|*.odt)Linux で find コマンドを使用してファイルを削除しますこの方法では、以下に示すように、find コマンドの適切なオプションを使用するか、xargs コマンドでパイプを使用することができます。現在のディレクトリ内の .gz を除くすべてのファイルを削除します
$ shopt -u extglobfind コマンド - .gz を除くすべてのファイルを削除します6. パイプと xargs を使用して、上記の例を次のように変更できます。ファイルを削除する find および xargs コマンド7. 次のコマンド ラインは、現在のディレクトリにある .gz、.odt、および .jpg を除くすべてのファイルを削除します。指定された拡張子ファイルbash の GLOBIGNORE 変数を使用してファイルを削除しますただし、この最後の方法は bash でのみ機能します。 GLOBIGNORE 変数には、パス名拡張関数で無視されるパターン (またはファイル名) のコロンで区切られたリストが格納されます。
この方法を使用するには、ファイルを削除するディレクトリに移動し、次のように GLOBIGNORE 変数を設定します:
$ 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] {}
この場合、.odt、.iso、.txt を除くすべてのファイルが、カレントディレクトリが削除されます。
次に、次のコマンドを実行してこのディレクトリをクリアします:
$ find . -type f -not -name '*.gz' -delete
その後、GLOBIGNORE 変数を閉じます:
$ unset GLOBIGNORE
使用 bash 变量 GLOBIGNORE 删除文件
注:为了理解上面的命令行采用的标识的意思,请参考我们在每一个插图中使用的命令对应的 man 手册。