基本的なファイル システム管理タスクの 1 つは、さまざまな種類のファイルやディレクトリの作成、変更、削除です。ファイル削除のためのいくつかの基本的なツールと概念を知っておくと便利で、時間を節約できます。
Linux には、ファイル削除タスクの実行に役立つツールがいくつか用意されています。多くの場合、いくつかの基準に基づいて、単一のファイルやディレクトリだけでなく、多数のファイルやディレクトリを削除する必要があります。タスクを簡単に実行するには、いくつかの一般的なコマンドとその組み合わせを知っておくと役立ちます。
- 以下のコマンドは、特に正規表現や find コマンドで一部の検索パターンを使用するものには注意して使用してください。間違った式やパターンを使用すると、重要なデータ/システム ファイル、または単に意図されていないファイルが削除される可能性があります。
- 重要なデータとシステム ファイルの最新のバックアップを常に確保してください。
- このようなコマンドを実行する前に、特に Sudo またはスーパーユーザー (root) としてコマンドを実行する場合は注意してください。
リンク解除を使用して削除する
それほど人気はありません。単一のファイルを完全に削除するには、
unlink
コマンドを使用します。
$ unlink {file-name}
単一のファイルを削除する
ファイルを削除するためにより一般的に使用されるコマンド、つまり、1 つ以上のファイルの同時削除をサポートする
rm
コマンドがあります。
$ rm {file-name}
rm
書き込み保護されているファイルの削除を確認するプロンプトを表示し、それ以外の場合はファイルを直接削除します。ファイルを削除する前に
rm
常にプロンプトを表示するには、
-i
フラグを使用します。
$ rm -i {file-name}
rm
コマンドは画面にメッセージを表示せずに削除します。
rm
コマンドが実際に行っていることをリストするには、
-v
フラグを付けて rm を使用します。
$ rm -v {file-name}
確認を求めるプロンプトを表示せずに書き込み保護されたファイルを削除するには、
-f
フラグを使用します。
$ rm -f {file-name}
複数のファイルを削除する
rm
に引数として複数のファイル名を指定することで、複数のファイルを削除できます。
$ rm {file-name-1} {file-name-2} {file-name-3} ... {file-name-N}
rm
正規表現もサポートしています。
file-name-*
という名前のファイルをすべて削除したい場合は、次のコマンドを使用できます。
$ rm file-name-*
正規表現を使用して複数のファイルを指定することもできます。
file-name-1
、
file-name-2
、
file-name-3
に一致する 3 つのファイルを削除したい場合は、次のようなものを使用できます。
$ rm file-name-[123]
ディレクトリを削除する
空のディレクトリは、
-d
オプションを指定した
rm
コマンドを使用して削除できます。
$ rm -d {dir-name}
ファイルの削除でサポートされているオプションは、
-d
フラグを使用してディレクトリの削除と組み合わせることもできます。例えば:
$ rm -idv {dir-name}
空ではないディレクトリを削除するには、
-r
フラグを使用します。
$ rm -r {dir-name}
ディレクトリとその内容を削除する前にプロンプトを表示したくない場合は、
-rf
フラグを使用します。これにより、確認なしにディレクトリ自体を含むディレクトリ内のすべてが削除されます。特に root として使用する場合は注意してください。
$ rm -rf {dir-name}
ファイルの検索と削除
より複雑な要件の場合は、さまざまなオプションを指定して find コマンドを使用できます。
{dir-to-search}
で指定されたパス内のパターン
{pattern}
に一致するすべてのファイルを削除するには
$ find {dir-to-search} -type f -name {pattern} -exec rm -f {} \;
例:
$ find /var/tmp -type f -name "*.tmp" -exec rm -f {} \;
{dir-to-search}
内のディレクトリを含む、パターン
{pattern}
に一致するものをすべて削除したい場合は、上記のコマンドを次のように少し変更します。
$ find {dir-to-search} -name {pattern} -exec rm -rf {} \;
find コマンドの最新バージョンは、内部で削除機能をサポートしています。ここで、
-delete
フラグは rm コマンドを置き換えますが、
-depth
、ディレクトリ自体の前に最初にディレクトリの内容を処理するように find コマンドに指示します。
$ find {dir-to-search} -type f -name {file-name-pattern} -depth -delete
上記の例は、一致したファイルごとに
rm
コマンドの新しい外部プロセスを生成しないため、多数のファイルを操作する場合により効率的です。ただし、
find
コマンドのすべてのバージョンが (まだ)
-delete
フラグをサポートしているわけではありません。代わりに、以下の例に示すように、
xargs
コマンドを
find
とともに使用するオプションがあります。
$ find {dir-to-search} -type f -name {pattern} -print0 | xargs -0 rm
または、exec コマンドの
+
ターミネータを使用して、xargs のように find コマンドで見つかったすべてのものを連結します。
$ find {dir-to-search} -name {pattern} -exec rm -rf {} +
デフォルトでは、find コマンドは
-print
フラグを使用しますが、通常はこのフラグの書き込みを省略します。
xargs
を使用する場合、各ファイル名の間に
new-line
文字が入らないようにする必要があります。そのため、
-print0
フラグは、見つかったすべてのファイル名の後に
null
文字を出力するよう find に指示します。
同様に、両方のコマンドが結合されるように、
xargs
で
-0
フラグを指定します。ここでの
rm
コマンドは、パイプされた
find
入力によって渡されたファイルを削除します。たとえば、次のコマンドは、現在のユーザーのホーム ディレクトリ (
~
記号で指定) からすべての
*.tmp
ファイルを検索して削除します。
$ find ~ -name "*.tmp" -print0 | xargs -0 rm
find
コマンドには、所有権、アクセス許可、タイムスタンプなどを含むファイルやディレクトリを検索するためのいくつかの方法が用意されています。特定のファイル削除タスクに役立ついくつかの方法について説明します。
ユーザーによるファイルの検索と削除
特定の
user
が所有する特定のディレクトリ内のすべてを削除するには、次を使用します。
$ find {dir-to-search} -mindepth 1 -user {user-name} -delete
上記の例では、値 1 の
-mindepth
フラグにより
{dir-to-search}
で指定されたディレクトリが検索パターンと条件に一致する場合に削除されなくなります。または、特定の
group
に属する指定されたディレクトリ内のすべてを削除するには、次を使用します。
$ find {dir-to-search} -mindepth 1 -group {group-name} -delete
検索パスの下のサブディレクトリを走査したくない場合は、適切なディレクトリの深さの値を指定して
-maxdepth
を使用するオプションもあります。
実行例を次に示します。
$ find tempdir/ -mindepth 1 -maxdepth 1 -user abhisheknair -group abhisheknair -delete
代わりに
user-id
と
group-id
を指定したい場合は、次のようなことを試すことができます。
$ find {dir-to-search} -mindepth 1 -uid {user-id} -gid {group-id} -delete
空のディレクトリを見つけて削除する
指定されたパス
{dir-to-search}
内の空のディレクトリをすべて削除するには、次を使用できます。
$ find {dir-to-search} -type d -empty -delete
代わりに、指定されたパス
{dir-to-search}
内の空のファイルをすべて削除するには、次を使用します。
$ find {dir-to-search} -type f -empty -delete
X より古いファイルを検索して削除する
場合によっては、
x
日より古いファイルを削除する必要があるかもしれません。 find には、ファイルの作成時間 (
ctime
)、アクセス時間 (
atime
)、および変更時間 (
mtime
) を読み取るオプションがあります。 find で
mtime
オプションを使用すると、
x
日以上前に変更されたファイルを検索して削除できます。
$ find {dir-to-search} -type f -mtime +{X} -delete
たとえば、
/var/tmp
内の変更時刻が 30 日以上前で、拡張子が log であるすべてのファイルを削除するには、次のコマンドを使用できます。
$ find /var/tmp -name "*.log" -type f -mtime +30 -delete
許可に基づいてファイルを検索して削除します
今後は、次のような特定の権限に基づいてファイルを削除することもできます。
$ find {dir-to-search} -name {pattern} -perm {NNN} -delete
例:
$ find /var/tmp -name "temp*" -perm 755 -delete
または、許可にシンボリック形式を使用したい場合は、次を使用します。
$ find {dir-to-search} -name {pattern} -perm u={rwx},g={rwx},o={rwx} -delete
例:
$ find /var/tmp -name "temp*" -perm u=rwx,g=rw,o=rw -delete
まとめ
Linux には、単純で正規表現を使用して簡単に拡張できる
unlink
、
rm
、および
rmdir
コマンドが用意されています。より高度なニーズについては、
find
や
xargs
などのツールを組み合わせて使用して、必要なことを実現するオプションがあります。この記事の例以外にも、find を使用可能なフラグとともに使用して検索をカスタマイズするオプションがあります。詳細については、各コマンドのマニュアル ページを参照してください。
常に
rm
または
-delete
フラグを指定せずに find コマンドを実行し、その出力を分析して、実際のコマンドの実行によってどのファイルまたはディレクトリが影響を受けるかを確認してください。適切なバックアップ構成とポリシーがあると、誤って削除した場合だけでなく、ハードウェア障害やサイバー攻撃が発生した場合にも役立ちます。