コマンド rm | |
| 原作者 | ケン・トンプソン、デニス・リッチー (AT&Tベル研究所) |
|---|---|
| 開発者 | さまざまなオープンソースおよび商用開発者 |
| 初回リリース | 1971年11月3日 |
| 書かれた | C |
| オペレーティング·システム | Unix、Unix ライク、V、Plan 9、Inferno、KolibriOS、IBM i |
| プラットフォーム | クロスプラットフォーム |
| タイプ | 指示 |
| ライセンス | coreutils : GPLv3+ プラン 9: MIT ライセンス |
rm( removeの略)は、 UnixおよびUnix系オペレーティングシステムの基本コマンドであり、コンピュータファイル、ディレクトリ、シンボリックリンクなどのオブジェクトをファイルシステムから削除するために使用されるほか、デバイスノード、パイプ、ソケットなどの特殊ファイルも削除するために使用される。MS -DOS、OS/2、Microsoft Windowsのコマンドに似ている。このコマンドは、EFIシェルでも使用できる。[1] del
概要
このコマンドは、 unlinkrmシステム コールを使用して、ファイル システムからオブジェクトへの参照を削除します。これらのオブジェクトには複数の参照 (たとえば、2 つの異なる名前を持つファイル) がある可能性があります。オブジェクト自体は、すべての参照が削除され、オブジェクトへのオープン ハンドルを持つプログラムがなくなった場合にのみ破棄されます。
これにより、プログラムがファイルを開き、すぐにファイルシステムから削除し、一時的なスペースとして使用できるシナリオが可能になります。プログラムがクラッシュして終了した場合でも、プログラムの終了後にファイルのスペースが再利用されることがわかっています。
このコマンドは、参照のリンクを解除するだけを目的としているため、通常はファイル データを破壊しません。また、解放されたファイル システム領域には、削除されたファイルのデータが残っている場合があります。これは、場合によってはセキュリティ上の懸念となる可能性があり、強化バージョンでは、最後のリンクが切断されるときにデータを消去する機能が用意されている場合があり、データ消去機能に特化した shredやsrmなどのプログラムが利用可能です。
rm一般的にUNIX系オペレーティングシステムでのみ見られ、通常、ごみ箱のようなメカニズムを介して削除されたファイルを回復する機能は提供されていないため、[2]ユーザーはrm誤ってファイルを削除しないように、何らかのラッパーで囲む傾向があります。
インデックスの再構築を試み、部分が再利用されなかった場合にファイルを元に戻すことができる 削除取り消しユーティリティがあります。
歴史
Unixの古いバージョンでは、rmディレクトリが空の場合、コマンドはディレクトリを削除します。[3]rmこの動作は、フラグを使用する-dことで、 4.4BSD-Lite2から派生したBSD ( FreeBSD、[4] NetBSD、[5] OpenBSD [6]およびmacOSなど)
など、一部のバージョンでは引き続き得られます。
GNU coreutilsrmにバンドルされているバージョンは、 Paul Rubin、David MacKenzie、 Richard Stallman、Jim Meyeringによって書かれました。 [7]このバージョンでは、互換性を保つためにオプションも提供されています。[8] 同じ機能が標準コマンドでも提供されています。
-drmdir
バージョン 7-iのオプションは、バージョン 1で初めて導入された 、つまり「スイッチから削除」に代わるものです。Doug McIlroy は、は「発音できない名前のファイルをクリーンアップするために設計された必死のツールでした」と書いています。 [9]dswdsw
このコマンドは、一般的なGNU UnixライクなユーティリティのネイティブWin32ポートのUnxUtilsコレクションの一部として、Microsoft Windows用の個別のパッケージとして利用できます。 [10] KolibriOSには、このコマンドの実装が含まれています。[11] rmコマンドは、 IBM iオペレーティングシステムにも移植されています。[12] rm
構文
rmオプションを追加した後に指定されたファイルを削除します。ユーザーは、削除するファイルを指定するためにフルパスまたは相対ファイルパスを使用できます。 rmデフォルトではディレクトリを削除しません。[13]は、ユーザーが現在いるディレクトリ内の
rm fooファイル「foo 」を削除します。
rm他のコマンドと同様に、オプションを使用して動作を指定します。
-r「再帰的」はディレクトリを削除し、事前に内容を再帰的に削除します(ファイルがディレクトリのないままにならないようにするため)。-i、すべての削除の確認を求める「インタラクティブ」。-f、「force」は存在しないファイルを無視し、確認プロンプトを無視します(事実上、をキャンセルします-i)。ただし、ディレクトリが書き込み保護されている場合は、ディレクトリからファイルを削除しません。-v, 「verbose」は、rm実行中の処理を端末に表示します。-d、"directory" は空のディレクトリを削除し、指定されたディレクトリが空の場合にのみ機能します。--one-file-systemは、引数と同じファイル システム上のファイルのみを削除し、マウントされたファイル システムは無視します。
rm誤ってファイルを削除しないように、シェルエイリアス ( C シェル エイリアス、Bourne シェル、または Bash) 関数 " "でオーバーレイできます。ユーザーが確認なしで大量のファイルを削除したい場合は、オプションを追加して手動で引数を取り消すことができます(拡張されたコマンド ライン " " で後で指定されたオプションが優先されるため)。残念ながら、このアプローチはワイルドカードの使用に対する危険な習慣を生み出し、独自の誤った削除につながります。
rm -i-i-frm -i -f
rm -rf(さまざまなrm -rf /、、rm -rf *など)は、Unixの災害に関するジョークや逸話で頻繁に使用されます。[14]たとえば、 Pixarでの映画「トイ・ストーリー2」の制作中に多くのファイルが失われたことなどです。[15]コマンドの亜種をスーパーユーザーで実行すると、現在のファイルシステムからアクセス可能なすべてのファイルがマシンから削除されます。
rm -rf /
rm削除するファイルのリストを指定するために、
xargsと組み合わせて使用されることがよくあります。
xargs rm < ファイルリスト
または、現在のディレクトリの下のすべてのディレクトリにある すべてのPNG 画像を削除するには、次のようにします。
検索 . -name '*.png' -exec rm {} +
権限
通常、ほとんどのファイルシステムでは、ファイルを削除するには親ディレクトリへの書き込み権限(および、ディレクトリに入るための実行権限)が必要です。(初心者にはわかりにくいかもしれませんが、ファイル自体の権限は関係ありません。ただし、GNU では、rm-f オプションを使用しない限り、書き込み保護されたファイルを削除する場合は確認を求められます。)[16]
ディレクトリを削除するには ( を使用rm -r)、その内容をすべて再帰的に削除する必要があります。そのためには、そのディレクトリ (空でない場合) と、空でないサブディレクトリ (存在する場合) すべてを再帰的に、読み取り、書き込み、実行の権限を持っている必要があります。読み取り権限は、ディレクトリの内容を削除するために一覧表示するために必要です。このため、空でないディレクトリは書き込み権限がないため削除できず、その内容も削除できないという奇妙な状況が発生することがあります。しかし、同じディレクトリが空であれば削除できます。[17]
スティッキー ビットが設定されたディレクトリにファイルが存在する場合、ファイルを削除するにはファイルの所有者である必要があります。
ファイルシステムルートの保護
Sun Microsystems は、2005 年に最初にリリースされたSolaris 10rm -rf /で" " 保護を導入しました。 コマンドを実行すると、システムは / の削除が許可されていないと報告するようになりました。 [18] その後すぐに、同じ機能がユーティリティのFreeBSDバージョンに導入されました。[19]オプションが指定されている場合、 GNU は実行を拒否します。 [20]これは、2006 年にGNU Core Utilitiesのバージョン 6.4 がリリースされて以来、デフォルトになっています。新しいシステムでは、このオプションがなくても、このフェイルセーフは常にアクティブです。 コマンドを実行するには、ユーザーはスーパーユーザーであっても、
オプション を追加してフェイルセーフをバイパスする必要があります。rm rmrm -rf /--preserve-root--no-preserve-root
ユーザープルーフ
システム管理者、設計者、さらにはユーザーでさえ、次のようなエイリアスや関数を作成して、誤ってファイルを削除してしまうのを防ごうとすることがよくあります。
エイリアスrm = "rm -i"
rm () { /bin/rm -i " $@ " ; }
その結果、rmユーザーはファイルごとに Y キーまたは N キーを押して削除するかどうか確認することになります。残念ながら、これによってユーザーはコマンドに渡すワイルドカードについて不注意になる傾向がありrm、削除を確認するために交互にパットとリターン キーを押す傾向が強くなりますy(保持する必要のある 1 つのファイルを過ぎるまで)。[引用が必要]ユーザーは、各ファイルに自動的に「y」を挿入する「」 まで使用することもあります。 [引用が必要]yes | 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」[21]や「trash」[22]など、重要なファイルを誤って削除するのを防ぐサードパーティの代替手段が存在します。
コマンドライン引数の最大制限
複数のLinuxディストリビューションで使用されているGNU Core Utilitiesの実装では、コマンドライン引数に制限があります。引数は通常、カーネルに割り当てられたページサイズの32倍に制限されています。したがって、ページサイズが4KBのシステムでは、引数のサイズ制限は128KBになります。[23]
カーネル2.6.23(2007年10月9日リリース)より前のコマンドライン引数の場合、制限はカーネルのコンパイル時に定義され、ファイルMAX_ARG_PAGES内の変数を変更することで変更できますinclude/linux/binfmts.h。[24] [25]
新しいカーネル[ which? ]では、引数の最大長が最大スタック制限(ulimit -s)の25%に制限されます。制限を超えると、エラーメッセージが表示されます/bin/rm: Argument list too long.[26] [明確化が必要]
参照
- srm (Unix) : Unix でファイルを安全に削除する
- unlink() :このユーザー空間プログラムが主な機能のために呼び出す基礎となるシステムコール
- del (コマンド)
- デルツリー
- dsw (コマンド) - 削除が難しいファイルを削除する古い Unix コマンド
参考文献
- ^ 「EFI シェルとスクリプト」 。Intel 。2013年 9 月 25 日閲覧。
- ^ 「Unix - よくある質問 (3/7) [頻繁な投稿]セクション - ファイルを「削除解除」するにはどうすればよいですか?」www.faqs.org。
- ^ 「unix 8thマニュアルのセクション1のrmページ」man.cat-v.org。
- ^ "RM(1)", FreeBSD-5.4-RELEASE 、2015年2月5日閲覧
- ^ "RM(1)", NetBSD-2.0 、2015年2月5日閲覧
- ^ "RM(1)", OpenBSD-3.6 、2015年2月5日閲覧
- ^ 「rm(1): ファイル/ディレクトリを削除する - Linux man ページ」. linux.die.net .
- ^ Krzysztof Goj (2012 年 1 月 22 日). 「rm: 空のディレクトリを削除する新しいオプション --dir (-d)」. coreutils.git .
- ^ McIlroy, MD (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (技術レポート). CSTR. Bell Labs. 139.
- ^ 「いくつかの GNU ユーティリティのネイティブ Win32 ポート」unxutils.sourceforge.net。
- ^ “シェル - KolibriiOS wiki”. wiki.kolibrios.org。
- ^ IBM . 「IBM System i バージョン 7.2 プログラミング Qshell」(PDF) . IBM . 2020 年 9 月 5 日閲覧。
- ^ 「rm(1) - Linuxマニュアルページ」man7.org .
- ^ Gite, Vivek. 「Linux/UNIX: ファイルを削除する」. Nixcraft . 2011 年11 月 24 日閲覧。
- ^ パンザリーノ、マシュー(2012年5月21日)。「『トイ・ストーリー2』が2度削除された理由、1度は事故、もう1度は故意」TNW | メディア。 2022年9月27日閲覧。
- ^ 「Linux rmコマンドのヘルプと例」。ComputerHope。2018年1月24日。2016年4月16日時点のオリジナルよりアーカイブ。 2019年1月24日閲覧。
- ^ McElhearn, Kirk (2014 年 1 月 2 日)。「コマンドラインをマスターする: ファイルとフォルダの削除」。Macworld。2019年1月 24 日閲覧。
- ^ 「魔法使いの諸問題への干渉」。2016年11月3日時点のオリジナルよりアーカイブ。
- ^ 「前回のコミットでは、rm(1) に警告して削除するコードが追加されました。 · freebsd/freebsd@d6b7bd9」。GitHub。
- ^ 「rm 呼び出し (GNU Coreutils)」。www.gnu.org。
- ^ 「Launchpad での Safe-rm」。Launchpad。
- ^ 「andreafrancia/trash-cli」。2020年9月12日 – GitHub経由。
- ^ 「Linux の「引数が多すぎる」制限を回避する方法」。Stackoverflow。ARG_MAXと ulim -s / 4 の結合により、引数の最大長として MAX_ARG_STRLEN が導入されました。[...] MAX_ARG_STRLEN は、
linux/include/uapi/linux/binfmts.h でページ サイズの 32 倍として定義されています [...] デフォルトのページ サイズは 4 KB なので、128 KB を超える引数を渡すことはできません [...]
- ^ 「Linux_2_6_23 - Linuxカーネル初心者」. kernelnewbies.org .
- ^ 「kernel/git/torvalds/linux.git - Linuxカーネルソースツリー」。git.kernel.org。
- ^ 「「引数リストが長すぎます」: 引数と制限を超えて | Linux Journal」。www.linuxjournal.com。
さらに読む
外部リンク
- : ディレクトリ エントリを削除する – シェルおよびユーティリティ リファレンス、The Single UNIX 仕様、バージョン 4、The Open Group
- – Plan 9プログラマーズマニュアル、第 1 巻
- – インフェルノ一般コマンドマニュアル
