特定の拡張子を持つ複数のファイルを削除したい場合があります。このチュートリアルは、まさにそれを行うのに役立ちます。
rmコマンドを使用して、次の方法でファイルとフォルダーを削除します。
rm [option] filename
ここで正確なファイル名を知る必要があるように見えるかもしれませんが、そうではありません。
ファイル拡張子に基づいて複数のファイルを削除するいくつかの方法を紹介します。
方法1:rmコマンドを使用して拡張子でファイルを削除する
私の例では、拡張子が.gifで終わるgifファイルがたくさんあります。
それらを削除するには、次のようにrmコマンドを使用できます。
rm *.gif
そのように盲目的にファイルを削除するのは危険です。 lsコマンドを使用して、どのファイルが削除されるかを最初に確認することをお勧めします。
ls *.gif
拡張子が.gifのファイルを削除する方法は次のとおりです。
$ ls
1.gif 2.gif 3.gif 4.gif a.jpg b.png c.webp
$ ls *.gif
1.gif 2.gif 3.gif 4.gif
$ rm -v *.gif
removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'
$ ls
a.jpg b.png c.webp
これは、.gifだけでなく、任意のファイル拡張子に対して実行できます。複数の拡張機能を組み合わせることもできます。
$ ls
f1.txt f2.txt f3.txt f4.txt not-txt-file.pdf random.txt
$ rm -v *.txt *.pdf
removed 'f1.txt'
removed 'f2.txt'
removed 'f3.txt'
removed 'f4.txt'
removed 'not-txt-file.pdf'
$ ls
random.txt
💡各ファイルを削除する前に確認を求めるrmコマンドでインタラクティブな-iオプションを使用できます。ただし、削除するファイルが多数ある場合、これは便利ではない可能性があります。 どのように機能するのか疑問に思いますか?ワイルドカード!
一言で言えば、ワイルドカードは、特定のパターンに一致させるために使用する特殊文字です。以下は、頻繁に使用されるいくつかのワイルドカードです。
Wilcard | 使用 |
---|---|
* | 1つ以上のオカレンスに一致 |
? | 単一のオカレンスに一致 |
[] (角かっこ) | 一致する範囲を指定します |
^ | 試合から除外 |
ここでは*ワイルドカードを使用しました。これは、任意の文字の1つ以上の出現に一致できることを意味します。
*.gif
と言うとき 、.gif
につながる文字の任意の組み合わせを意味します 。つまり、拡張子が.gif
のすべてのファイルが表示されます。 。
1つ以上のワイルドカードに加えて、各ワイルドカードを使用できます。しかし、今はそれらの詳細には立ち入らないようにしましょう。
*と拡張子の間のドットは重要です!
多くの人が*.gif
を混乱させるという間違いを犯します *gif
を使用 。これは正しくないです。 *と拡張子名の間のドット(。)は重要です。
次のファイルを使用してシナリオを作成し、正規表現*gif
を使用するとどうなるかを確認します。 *.gif
の代わりに :
$ ls
1.gif 2.gif 3.gif 4.gif definately-not-a-gif jpg-not-gif not-a-gif
$ rm -v *gif
removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'
removed 'definately-not-a-gif'
removed 'jpg-not-gif'
removed 'not-a-gif'
また、文字列gif
のファイルも削除されました その中で、それはファイルの拡張子ではありませんでしたが、ファイル名の最後に前のドットなしでgifが付いていました。
ワイルドカードまたは正規表現を含むファイルを削除するときは、できるだけ正確であることを確認してください。
方法2:findコマンドを使用して特定の拡張子を持つファイルを再帰的に削除する
rmコマンドは、現在のディレクトリ内のファイルのみを削除します。再帰オプションを使用しても、サブディレクトリからファイルは削除されません。
特定の拡張子を持つファイルを再帰的に削除するには、findコマンドとrmコマンドを組み合わせることができます。
これは、サブディレクトリにも.gifファイルがある例です。
$ ls *
file_0.gif file_z.txt not-a-gif not-a-txt
dir1:
file_1.gif file_a.txt not-a-gif not-a-txt
dir2:
file_2.gif file_b.txt not-a-gif not-a-txt
dir3:
file_3.gif file_c.txt not-a-gif not-a-txt
dir4:
file_4.gif file_d.txt not-a-gif not-a-txt
ファイルを削除するには、次のような検索コマンドを使用できます。
find . -type f -name "*.gif" -exec rm -v {} \;
コマンドを実行したときの出力は次のとおりです。
$ find . -type f -name "*.gif" -exec rm -v {} \;
removed './dir1/file_1.gif'
removed './dir3/file_3.gif'
removed './dir2/file_2.gif'
removed './file_0.gif'
removed './dir4/file_4.gif
分解してみましょう。
- 「検索」の後のピリオドは、現在のディレクトリを検索することを意味します
- 「-name」フラグは、正規表現を使用できるファイルの名前を指定します
- 「-exec」フラグは、findコマンドの結果に対してbashコマンドを実行するために使用されます
- 「{}」中括弧は、一致したファイルの結果のプレースホルダーとして機能するため、「rm -v {}」は、コマンドが見つかったファイルを削除します。
- 最後に、セミコロンはシェルによって実行されたコマンド(execの後のコマンド)を終了し、セミコロンが適切にエスケープされるように円記号'\'が使用されます。これについて心配する必要はありません。
以下のチュートリアルで、findコマンドのその他の例を学ぶことができます。
高度なボーナスのヒント:複数の拡張子を持つファイルを操作するには、findコマンドを使用します
上記のコマンドは、「rm * .gif*.txt」
のような複数の拡張子を持つファイルの検索には対応していません。
これを実現するには、-o
を使用できます '論理OR演算子'を意味する引数。ただし、括弧をエスケープするにはバックスラッシュ「\」も使用する必要があります
$ ls *
file_0.gif file_z.txt not-a-gif not-a-txt
dir1:
file_1.gif file_a.txt not-a-gif not-a-txt
dir2:
file_2.gif file_b.txt not-a-gif not-a-txt
dir3:
file_3.gif file_c.txt not-a-gif not-a-txt
dir4:
file_4.gif file_d.txt not-a-gif not-a-txt
$ find . \( -name "*.gif" -o -name "*.txt" \) -exec rm -v {} \;
removed './dir1/file_1.gif'
removed './dir1/file_a.txt'
removed './dir3/file_3.gif'
removed './dir3/file_c.txt'
removed './dir2/file_2.gif'
removed './dir2/file_b.txt'
removed './file_0.gif'
removed './file_z.txt'
removed './dir4/file_d.txt'
removed './dir4/file_4.gif'
ここでは、拡張子が「txt」のすべてのファイルと拡張子が「gif」のファイルが再帰的に削除されていることがわかります。
ファイル拡張子の種類ごとに個別にfindコマンドを使用する方が簡単で、間違いではないように感じるでしょう。
この記事では、特定の拡張子を持つファイルの削除について説明しました。また、これらのファイルを再帰的に見つけて削除することも検討しました。
「大きな力には大きな責任が伴う」 、ワイルドカードと正規表現を使用する場合は、これを覚えておいてください。 1つのタイプミスや重要なファイルが、意図せずに削除される可能性があります。