質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

解決済

4回答

2189閲覧

rm -i -r コマンドを簡略化することはできますか?

退会済みユーザー

退会済みユーザー

総合スコア0

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

1クリップ

投稿2020/09/05 03:03

編集2020/09/05 05:05

環境は macOS です。
普段誤爆を避けるためにrm コマンドには**-iオプションをつけています。
しかしディレクトリを削除するときは、中のすべてのファイルに確認のyをタイプする必要があります。
たくさんファイルがある場合はこれは困難であり結局
rm -rf** してしまいときどき誤爆します。

このディレクトリ〇〇を削除しますか?の1回で削除が完了するようにするにはどうすればいいでしょうか。

質問を書きながら yes/noを確認してからrmを実行するシェルスクリプトを書いて、rmのエイリアスにすればいいかなとも思いましたが、別のうまい解決策があれば教えてほしいです。
例えば

  • まさにその動作ができるコマンドがある
  • 一度yを押したら自動でyを出力できるようにできる

など

rm コマンドのごみ箱に送らない動作自体はむしろ好ましく感じているので、ごみ箱に送るコマンドにエイリアスで置き換えるといった手段はできれば避けたいです。

直近の誤爆事例

  1. 数ヶ月前から放置していたhogeを再開して見るとエラーが出て動かない。
  2. 仕様の思い出しも兼ねて土台部分を書き直そうと hoge2 を作成
  3. よく見るとエラーは大したことなさそうだったので、書き直しをやめてhoge2を削除することにする
  4. rm -rf h からのTab補完でrm -rf hoge になっていることを気づかずEnter
  5. バックアップは古すぎてあまり意味がなかった

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/09/05 03:15

最初に一回だけ聞いて欲しいのであれば、単に「Enterを押す前に一呼吸置く」で済むと思うのですが?
hidezzz

2020/09/05 05:11 編集

追記された「直近の誤爆事例 」の場合、削除対象が表示されたとしても間違いに気づけない可能性がありそうです。 「数カ月まえから放置」ということだとしたら、その間に1回でもバックアップが取られていれば(1ヶ月に1回のペースでも)防げた事例だと思いました。
退会済みユーザー

退会済みユーザー

2020/09/05 06:46

> バックアップ もちろんそれは正論で、その方面でも対策は考えてますが、現状、所有している記録媒体の容量が定期バックアップできるほどにはないんですよね。明らかに重要なものはバックアップ対象にしていますが
otn

2020/09/05 09:18

> 削除対象が表示されたとしても間違いに気づけない可能性がありそうです。 私もそう思います。 なんか、「暗号化ZIPで添付ファイルを送って、そのメールへの返信でパスワードを送る」というのを思い出しました。
otn

2020/09/05 09:23 編集

そもそもalias rm="rm -i"とかして、安易にrmする癖が付くと非常に危険だと思います。 「rmのEnterは命賭けて押す」くらいの習慣が良い。
guest

回答4

0

MacOSにはBSD由来のファイルフラグという物が有ります。

https://www.walbrix.com/jp/blog/2007-11-mac-os-xrm.html

>>Finderからファイルを「ロック」するとこのフラグが付くようだ。

と言う事らしいです。
※FreeBSDだとコマンドラインからcgflags入れないと設定できない。

linuxにも同様の機能があるようです(たしかchattrだったか・・)

他には強制アクセスコントロールという仕組みも利用する方法が有りますが
(これもMACといいます)

https://www.apple.com/jp/business/site/docs/resources/macOS_Security_Overview.pdf

多少面倒でしょう。ファイルフラグがおすすめです。

投稿2020/09/05 10:27

hana_yama_san

総合スコア923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Linuxに入っているrmには、ご所望のものと思われる「-I」オプションというものが追加されているみたいですね。

-I 3 個を超えるファイルを削除するか、ディレクトリを再帰的に 削除する場合は一度だけ確認をする。 多くの間違いを防ぎながらも -i よりは確認回数が少なくなる

対象マシンが1台であれば、このrmコマンドを何らかの方法で持ってくることが出来れば良いかもしれませんね。

ちなみにLinuxだとrmコマンドは「coreutils」というパッケージに入っています。Macでインストール可能なパッケージに同等のものがあるかもしれません。

※追記

自分ならどうしても消し間違えが許されない場合は次のようにします。
まず「rm -rf」の部分を「ls -R」に置き換えたコマンドを打って、削除対象に間違いが無いかを確認する。

terminal

1$ ls -lR / important-files

ちなみに上記の例は'/'の後ろに空白が入ってしまっており、そのまま削除しようとすると大変なことになりますが、lsの表示結果をちゃんと確認すれば気がつくはずです。
間違いを修正して再びlsを実行して削除対象が正しいことを確認する。

terminal

1$ ls -lR /important-files

削除対象が正しいことを確認したら、コマンドラインヒストリで呼び出して「ls -lR」の部分を「rm -rf」に修正して実行する。

terminal

1$ rm -F /important-files

投稿2020/09/05 03:19

編集2020/09/05 04:06
hidezzz

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/05 03:40 編集

知りませんでした。ありがとうございます。 ただ実行してみると理想的な動作ではなかったのでしばらく質問は開いておきます。(コマンドライン引数が警告に表示されて「ディレクトリ〇〇を削除しますか」となるともっと良い)
guest

0

ベストアンサー

3件回答が集まりましたが、消えてはいけないファイルを絶対に消さない方法を求めているわけではなく、あまり参考になりませんでした。
(rm コマンドを使わざるを得ない状況の話ではないので、それなら単にごみ箱を使えばいいだけです)

例で言えば Android の標準ファイラーの動作が理想ですね。

Zuishin さんのコメントをベストアンサーにしようかと思ったのですが、それはできないようなので自己解決扱いにします。

投稿2020/09/09 06:28

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/09/09 07:13

修正依頼で提案されてることをスルーしたんじゃ、いつまで待ってもその手の回答がつかないのは当然ですよね。拒否にしか見えないので、思いついたとしても回答を避けるでしょう。
退会済みユーザー

退会済みユーザー

2020/09/09 07:21

修正依頼とは何をさしますか? コメントはちゃんと読んでますし、情報が足りないという指摘はないと思いますが。
Zuishin

2020/09/09 07:22

> 質問への追記・修正の依頼 と書いているところで私が提案したもののことです。
退会済みユーザー

退会済みユーザー

2020/09/09 07:30

yes/no 判定の話ならば、私自身、最初から質問文の中で言及してますし、正直反応に困ったのですが...... 全レスするのが teratail の文化ならそれに従いますが。
Zuishin

2020/09/09 07:33

最も自分の求めるものに近いのがこれなら、そう書かなければ他の人が判断に迷うと思いませんか?
退会済みユーザー

退会済みユーザー

2020/09/09 07:36

> このディレクトリ〇〇を削除しますか?の1回で削除が完了するようにするにはどうすればいいでしょうか。 と、最初から質問文に書いてると思うのですが。
Zuishin

2020/09/09 07:40

それが伝わっていないから、その回答がついていないんですよ。 質問者は矛盾したことを書くことが多いので、何回か問いと応答を繰り返して意図を尋ねます。 あなたの場合はこれを無視したことで「質問にはこう書いてあるけど本当は違うんだ」と受け取られたわけです。
退会済みユーザー

退会済みユーザー

2020/09/09 07:51

わかりました。Zuishinさんみたいな回答者には毎回、質問文をちゃんと読んでくださいと答えれば良いのですね。 私の質問文に矛盾があるという指摘なら謝罪して修正しますが、質問文を読んでいない回答に返答しなかったことに責を求めされても困ります。
Zuishin

2020/09/09 07:52

まあこの回答は低評価で妥当ですね。あなたに理解できるよう説明するのは諦めました。
guest

0

こういう状況なら、私なら使い捨てのシェルスクリプトを作ります。

スクリプトを作った段階で目視確認・編集をしっかりやっておけばいいので、コマンドライン上で直接オペレーションを試みるよりは着実で安心です。間違えれば重大な損害が懸念される場合、安易に省力化を考えるべきではないでしょう。

たとえば以下のようなファイル構成だったとします。

$ ls -l **/* -rw-rw-r-- 1 koji koji 0 Sep 5 13:54 a/b/c/d.txt -rw-rw-r-- 1 koji koji 38 Sep 5 14:00 test.sh a: total 4 drwxrwxr-x 3 koji koji 4096 Sep 5 13:54 b a/b: total 4 drwxrwxr-x 2 koji koji 4096 Sep 5 13:54 c a/b/c: total 0 -rw-rw-r-- 1 koji koji 0 Sep 5 13:54 d.txt b: total 0

私はzshを使っているので以下のような感じです。bashを使うならさらにfindコマンドが必要でしょう。

$ ls -d **/*(/) |sort -r|xargs -i echo rm -r {} > test.sh $ cat test.sh rm -r b rm -r a/b/c rm -r a/b rm -r a

sort -rは別に要らないと言えば要らないですが、ディレクトリを下から順に確認するようにしたほうが安全でやりやすいかと思い、こうしてあります。

投稿2020/09/05 05:13

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問