rm (Unix)

rm
原作者ケン・トンプソンデニス・リッチーAT&Tベル研究所
開発者さまざまなオープンソースおよび商用開発者
初回リリース1971年11月3日 (1971年11月3日
書かれたC
オペレーティング·システムUnixUnixライクVPlan 9InfernoKolibriOSIBM i
プラットフォームクロスプラットフォーム
タイプ指示
ライセンスcoreutils : GPLv3+プラン 9: MIT ライセンス

rm( r e removeの略)は、ファイルシステムからファイル(ディレクトリなどの特殊ファイルを含む)を削除するシェルコマンドです。このコマンドはリンクを解除するだけ、つまりシステムコールを介してファイルへのハードリンクを削除するだけなので、実際にはファイルを削除しない(再利用のためにストレージを解放する)場合があります。ファイルに複数のリンクがあり、そのすべてが削除されていない場合、ファイルはファイルシステムに残り、他のリンクを介してアクセスできます。ファイルの唯一のリンクが削除されると、ファイルは削除され、そのストレージスペースが他の用途に解放されます。 unlink()

通常、削除されたファイルの元の記憶領域には、別のファイルの内容で上書きされるまで、ファイルのデータが残ります。このデータは通常のファイル操作ではアクセスできませんが、専用のツールを使用すれば復元できます。これは状況によってはセキュリティcpリスクとなるため、強化版のツールでは、ファイルが削除された際にファイルの記憶領域を消去する場合があります。shredやsrmなどのコマンドはデータ消去を具体的に実行します。

はごみ箱rmのようなファイルの復元のためのフォールバックを提供していないため、使用すると誤って情報を失うリスクを伴います。[ 1 ]ユーザーは、誤って削除されないように、 の呼び出しを安全機構で囲む傾向があります。インデックスの再構築を試み、ストレージが再利用されなかった場合にファイルを復元できる 削除取り消しユーティリティがあります。rm

もともとはUnix用に開発されたが、現在ではUnix系および非Unix系システム、KolibriOS [ 2 ][ 3 ]EFIシェル[ 4 ]Windows ( UnxUtils経由)でも利用可能である。[ 5 ]このコマンドはMS-DOSOS/2コマンドプロンプトでも同様の機能を提供する。 del

と同様にrm、このunlinkコマンドもファイルを削除 (リンク解除) しますが、一度に削除できるのは 1 つのファイルだけです。

歴史

Unixの古いバージョンでは、rmディレクトリが空の場合、このコマンドはディレクトリを削除していました。[ 6 ]rmこの動作は、フラグを指定したバージョン-d、例えば4.4BSD-Lite2から派生したBSDFreeBSD[ 7 ] NetBSD[ 8 ] OpenBSD [ 9 ]およびmacOSなど)では今でも得られます。

GNU Core Utilitiesのバージョンは、Paul Rubin、David MacKenzie、Richard Stallman、Jim Meyeringによって書かれました。[ 10 ]このバージョンでは-d互換性を保つためのオプションが提供されています。[ 11 ]同じ機能が標準rmdirコマンドでも提供されています。

オプション

コマンド実装で一般的に提供されるオプション:

  • -r, r再帰的; ディレクトリとその内容を再帰的に削除する
  • -iインタラクティブ;各ファイルの削除をユーザーに確認する
  • -f強制;存在しないファイルを無視し、確認プロンプトを無視します(事実上キャンセルします-i)、書き込み保護されたディレクトリからファイルを削除することはできません
  • -v詳細; ログステータス
  • -dディレクトリ; 空のディレクトリを削除します
  • --one-file-system引数と同じファイルシステム上のファイルのみを削除します。マウントされたファイルシステムは無視します。

使用

デフォルトでは、rm指定されたファイルを削除しますが、ディレクトリは削除しません。[ 12 ]たとえば、次の例はfooという名前のファイルを削除します。

$ rm foo 

しかし、 fooがディレクトリの場合、このコマンドは失敗します。ディレクトリfooを削除するには、次のようにします。

$ rm -r foo 

このコマンドは、ファイルのリストを提供するために xargsと一緒に使用されることがよくあります。

$ xargs rm <ファイルリスト 

現在のディレクトリの下にあるすべてのディレクトリ内の すべてのPNG 画像を削除するには:

$ find . -name '*.png' -exec rm {} + 

安全性

権限

ほとんどのファイルシステムでは、ファイルを削除するには、そのファイルを含むディレクトリに対する書き込み権限と実行権限が必要です。削除するファイルの権限は関係ないと考える人もいるかもしれません。しかし、GNU実装では、-fオプションを使用しない限り、書き込み保護されたファイルも削除されることが確認されています。[ 13 ]

ディレクトリを削除するには( を使用-r)、その内容を再帰的に削除する必要があります。そのためには、ディレクトリ(空でない場合)と、空でないサブディレクトリ(再帰的に)に対する読み取り、書き込み、実行権限が必要です。ディレクトリの内容を一覧表示するには読み取り権限が必要です。このため、空でないディレクトリはユーザーが書き込み権限を持たないため削除できないという奇妙な状況が発生することがあります。しかし、同じディレクトリが空であれば、ユーザーは削除できます。[ 14 ]

スティッキー ビットが設定されたディレクトリにファイルが存在する場合、ファイルを削除するにはユーザーがそのファイルを所有している必要があります。

誤って削除するのを防ぐ

のようなコマンドはrm -rf *、多くのファイルを回復不能な方法で削除する可能性があるため、比較的危険です。このようなコマンドは、映画『トイ・ストーリー2』の制作中など、悲惨なミスに関する逸話の中で言及されることがあります。[ 15 ] [ 16 ]

誤ってファイルを削除するリスクを最小限に抑える一般的な方法としては、デフォルトrmコマンドをエイリアスや対話型オプションを含む関数の背後に隠すというものがあります。例えば、次のようになります。

エイリアスrm = "rm -i"

または

rm () { /bin/rm -i " $@ " ; }

デフォルトでは、rmユーザーは各ファイルを削除する際にY、 またはプラス キーを押して確認を求められます。確認を省略するには、オプションを追加できます(展開されたコマンドラインで後から指定したオプション " " が優先されます)。 NReturn-frm -i -f

残念ながら、これは他の偶発的な削除につながる可能性があります。なぜなら、ユーザーは に渡すワイルドカードに注意を払わなくなり、無意識に と を押して確認するrm傾向が強まるからです。中には、各ファイルの削除を自動的に確認する を 使用するユーザーも見受けられます。YReturnyes | rm files

ユーザーが一度だけ確認できるようにし、適切なワイルドカードの使用を促し、リストの検証を容易にする妥協案は、次のようなもので実現できます。

if [ -n " $PS1 " ] ; then rm () { ls -FCsd " $@ " echo 'remove[ny]? ' | tr -d '\012' ; read if [ "_ $REPLY " = "_y" ] ; then /bin/rm -rf " $@ " else echo '(cancelled)' fi } fi

この関数はシェルスクリプトにすべきではないと言えるでしょう。シェルスクリプトにすると、検索パス内でシステムの前に見つかる危険性がありrm、また、バッチジョブを中断させる可能性のある非対話型シェルでも使用すべきではありません。定義をif [ -n "$PS1" ] ; then ....  ; fi構造で囲むことで、後者の危険性を回避できます。

他のコマンドは、誤って削除されないように設計されており、safe-rm[ 17 ][ 18 ]trashなどがあります。

ファイルシステムルートの保護

このコマンドをスーパーユーザーrm -rf /で実行すると、ファイルシステムのすべてのファイルが削除されます。安全のため、Sun Microsystems はSolaris 10 (2005 年初リリース)でこのコマンドに特別な保護を導入しました。実装では削除は許可されていないと報告されます。[ 19 ]その後まもなく、同じ機能がFreeBSD の実装に導入されました。[ 20 ] GNUバージョンでは、オプションが含まれていると実行が拒否されます。 [ 21 ]これは、 GNU Core Utilitiesバージョン 6.4 以降でデフォルトになっています。新しいシステムでは、オプションがなくてもこのフェイルセーフが常にアクティブになっています。このコマンドを実行するには、ユーザーはスーパーユーザーであっても、 オプションを追加してフェイルセーフをバイパスする必要があります。/rm -rf /--preserve-root--no-preserve-root

制限事項

GNU Core Utilitiesの実装では、コマンドライン引数に制限があります。引数は通常、カーネルに割り当てられたページサイズの32倍に制限されます。したがって、ページサイズが4KBのシステムでは、引数のサイズ制限は128KBになります。[ 22 ]カーネル2.6.23より前のバージョンのコマンドライン引数の場合、制限はカーネルのコンパイル時に定義され、ファイルMAX_ARG_PAGES内の変数を変更することで変更できますinclude/linux/binfmts.h[ 23 ] [ 24 ]新しいカーネルでは、引数の最大長は最大スタック制限(ulimit -s)の25%に制限されています。この制限を超えるとエラーが発生します。[ 25 ]

参照

  • deltree  – DOS および Windows 9x のコマンドリダイレクト先の簡単な説明を表示するページ
  • dsw (コマンド)  – 発音できない名前のファイルを削除するための廃止されたシェルコマンド

参考文献

  1. ^ 「Unix - よくある質問 (3/7) [頻繁な投稿]セクション - ファイルを「削除解除」するにはどうすればよいですか?www.faqs.org
  2. ^ "シェル - KolibriiOS wiki" . wiki.kolibrios.org
  3. ^ IBM . 「IBM System i バージョン 7.2 プログラミング Qshell」(PDF) . IBM . 2020年9月5日閲覧。
  4. ^ 「EFIシェルとスクリプト」 . Intel . 2013年9月25日閲覧。
  5. ^ 「いくつかの GNU ユーティリティのネイティブ Win32 ポート。unxutils.sourceforge.net
  6. ^ 「unix 8thマニュアルのセクション1のrmページ」。man.cat -v.org
  7. ^ "RM(1)"FreeBSD-5.4-RELEASE 2015年2月5日閲覧。
  8. ^ "RM(1)"NetBSD-2.0 、 2015年2月5日閲覧。
  9. ^ "RM(1)"OpenBSD-3.6 、 2015年2月5日閲覧。
  10. ^ 「rm(1): ファイル/ディレクトリを削除する - Linux manページ」 . linux.die.net .
  11. ^ Krzysztof Goj (2012年1月22日). 「rm: 空のディレクトリを削除するための新しいオプション --dir (-d)」 . coreutils.git .
  12. ^ "rm(1) - Linuxマニュアルページ" . man7.org .
  13. ^ 「Linux rmコマンドのヘルプと例」ComputerHope . 2018年1月24日. 2016年4月16日時点のオリジナルよりアーカイブ2019年1月24日閲覧。
  14. ^ McElhearn, Kirk (2014年1月2日). 「コマンドラインをマスターする:ファイルとフォルダの削除」 . Macworld . 2019年1月24日閲覧
  15. ^ Gite, Vivek. 「Linux/UNIX: ファイルを削除する」 . Nixcraft . 2011年11月24日閲覧
  16. ^パンザリーノ、マシュー (2012年5月21日). 「『トイ・ストーリー2』はなぜ2度も削除されたのか、1度は事故、もう1度は故意」 TNW | メディア. 2022年9月27日閲覧
  17. ^ 「 Launchpadの Safe-rm」。Launchpad
  18. ^ "andreafrancia/trash-cli" . 2020年9月12日 – GitHub経由.
  19. ^ 「魔法使いの諸問題への干渉」 。2016年11月3日時点のオリジナルよりアーカイブ
  20. ^ 「前回のコミットでは、rm(1) に警告を発して削除するコードが追加されました。 · freebsd/freebsd@d6b7bd9」 . GitHub .
  21. ^ 「rm の呼び出し (GNU Coreutils)」 . www.gnu.org .
  22. ^ 「Linuxの「引数が多すぎる」制限を回避する方法」。Stackoverflow。ARG_MAXとulim -s / 4の連携に伴い引数の最大長としてMAX_ARG_STRLENが導入されました。[...] MAX_ARG_STRLENはlinux/include/uapi/linux/binfmts.hでページサイズの32倍として定義されています。[...] デフォルトのページサイズは4KBなので、128KBを超える引数を渡すことはできません。[...]
  23. ^ 「Linux_2_6_23 - Linuxカーネル初心者」 . kernelnewbies.org .
  24. ^ "kernel/git/torvalds/linux.git - Linuxカーネルソースツリー" . git.kernel.org .
  25. ^ "「引数リストが長すぎます」: 引数と制限を超えて | Linux Journal」。www.linuxjournal.com

さらに読む