Syntax Error.

[Sy] Linuxでファイル名で検索したファイルを一括削除するコマンド(ワイルドカードも使えるよ)

2016/07/18

Linux同じ(ような)名前のファイルを検索して、一括削除するコマンド についてです。ワイルドカード指定文字数指定 も可能です。

  • Linuxで必要のなくなったファイルやlogファイルなどのゴミを一括削除したい。
  • だけど、削除対象のファイルがどのディレクトリにどのくらいの数あるのかわかっていない。

という場合など、ディレクトリ配下のファイルを検索して一括削除できると便利です。

そのような場合に使えるコマンドが、次のコマンドです。

$ find -name "ファイル名のパターン" -exec rm {} \;

このコマンドは大きく2段階に分けて考えると理解しやすいです。

まず最初に、find -name "ファイル名のパターン" の部分で、指定したパターンに一致するファイルのパスを一括で取得します。

その取得したファイルのパスに対して、後半の-exec rm {} \;の部分で、1件ずつ削除を実行している、ということです。

では例として、以下の様なディレクトリとファイルの構成があったとします。この場合に、上のコマンドを使ってどんなことができるか見ていきます。

dirA/
+ - a.log
+ - bc.log
+ - dirB/
|   + - a.log
|   + - dirC/
|       + - a.log
|       + - de.txt
+ - dirD/
    + - a.log
    + - de.log
    + - fgh.log

例1:検索ファイル名と完全一致するファイルを削除

まずは基本の 完全一致 での削除です。 指定されたファイル名と完全に一致するファイルを検索して、削除する ということを考えてみます。

先ほどのdirA/ディレクトリにまずは移動しておきます。

$ cd dirA/

では、とりあえずdirA/ディレクトリ以下にある、a.logというファイルをすべて検索してみます。すると、こんな感じの検索結果が表示されます。

$ find -name "a.log"
./a.log
./dirB/a.log
./dirB/dirC/a.log
./dirD/a.log

a.logというファイルがすべて検索されてパスが表示されたのがわかります。ただこのコマンドだと、ただ検索しただけなので、今回の目的である削除までやってみます。

$ find -name "a.log" -exec rm {} \;

これでdirA/ディレクトリ以下のa.logというファイル名のファイルはすべて削除されます。

例2:ワイルドカードを使って部分一致するファイルを削除

次は、ワイルドカード を使った方法です。

ワイルドカードを使うと、「ここはどんな文字でもOK」という表現ができるようになります。

例えば、 拡張子が log のファイルだけ削除したい という場合はこのようなコマンドでできます。

$ find -name "*.log" -exec rm {} \;

(削除されるファイル)
./a.log
./bc.log
./dirB/a.log
./dirB/dirC/a.log
./dirD/a.log
./dirD/de.log
./dirD/fgh.log

.logの部分は必ず一致する必要があるけど、その前は何でもいいよ!という意味になります。

逆に、 拡張子はなんでもいいけど、拡張子を除いたファイル名は de のものをすべて削除したい という場合は、こうです。

$ find -name "de.*" -exec rm {} \;

(削除されるファイル)
./dirB/dirC/de.txt
./dirD/de.log

例3:ワイルドカード(+文字数指定)を使って部分一致するファイルを削除

最後の例です。これは先程のワイルドカードに近いですが、*を使うことで なんでもOK ということを表現しましたが、ここで説明する?を使うと、 なんでも1文字ならOK という表現ができるようになります。

なので、拡張子を除いた文字数が2文字の log ファイルをすべて削除したい という場合は、このようなコマンドでできます。

$ find -name "??.log" -exec rm {} \;

(削除されるファイル)
./bc.log
./dirD/de.log

関連記事