名前が「-」(ハイフン、ダッシュまたはマイナス)で始まるファイルを削除するにはどうすればよいですか?


349

ファイル名がダッシュ(ハイフンまたはマイナス)で始まるファイルを削除するにはどうすればよいです-か?リモートOSXサーバーにssh'dし、ディレクトリにこのファイルがあります:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

どのように--helpしてCLIから削除できますか?この問題は時折さまざまな形で出くわします。これらのファイルは簡単に作成できますが、取り除くのは困難です。

バックスラッシュを使用してみました

rm \-\-help

引用符を試してみました

rm "--help"

マイナス(ダッシュまたはハイフン)文字がオプションとして解釈されるのを防ぐにはどうすればよいですか?


1
この質問が「名前が-で始まるファイルを削除する方法」に名前が変更されたら素晴らしいでしょう。
サンディ

@サンディ・アグリッド; 私は通常、質問の意味を変え嫌いが、この場合には受け入れ答えは、この問題に固有である
マイケルMrozek

33
rm --help始まるファイル名を削除する方法を実際に説明するのは少し皮肉だと思います-。それでも良い質問です。
レスマナ

1
@ jw013経験豊富なユーザーにとってヘルプは簡単に理解できる場合もありますが、初心者には圧倒されて混乱します。
iconoclast

1
BusyBoxのrmを使用したシステムでこれに遭遇しました。ヘルプを含むすべてが最小限であるため、rm --helpは手がかりを提供しませんでした。
dslake

回答:


497

「-」を使用して、rmにコマンドラインオプションの解析を停止させます。次のようにします。

rm -- --help

1
私はそれがこのように非常にシンプルなものを知っていた...
ブライアンRehbein

2
rmコマンドのすべてのバージョンが--引数をサポートしていますか?
キーストンプソン

3
@KeithThompson-ほとんどのGNUツールの機能であるため、ほとんどの非GNU(「非Linux」)Unix(たとえば、BSDバリアントまたは一部の組み込みシステム)
では機能しません

1
ありがとう!それは私の一日を救った。そしてもちろん、BSD(OSX)および他のコマンドでも動作します!
ラスハダフィ

8
@ dtech、getopt()および--predate GNU(SysIII、1980)は標準/ POSIXです。いくつかの例外を除く標準ユーティリティ(などecho)が理解し--ます。オプションを解析するためにgetopt()APIを使用しない場合、他のコマンドのYMMV。
ステファンシャゼラス

214

またはあなたがすることができます

rm ./--help

7
重要ではありませんが、これが最も「適切」と思われます。
ジェームズM.

2
これは私が覚えているものです。「rm---help」の使用は、私が常に調べなければならないものです。
-user603

25
このメソッドは、--特別に扱わないコマンドでも常に機能します。
jw013

そしてそれはまたのような特別な名前付き引数の(オプションの横にある)他のタイプのいくつかのコマンドによって、特別な処理を回避するために働く-のテキストユーティリティのかcdfoo=barawk...
ステファンChazelas

1
これは、ファイルが単一のダッシュで始まる場合に機能しますが、そうでrm -- <filename>はありません。
StockB

37

それを使用findして:

find . -name '--help' -delete

あなたが削除することができ、このようないくつかのファイル、より多くを持っている場合は、単純にせずに検索を実行してファイルのプレビューリストを取得することができますので、これは良い方法であり-delete、最初のオプション、およびファイルの一覧が良く見えるならば、単に実行しますそれで再び-delete

実際には、あなたは回避rmの賛成でfind(特にプレビュー最初に)あなたとミスを回避するのに役立ちます良い習慣であるrm *ことが必然的にいつの日かあなたをかみます。

ただし、そのfindはすべてのサブディレクトリを再帰的に処理するため、次のようなサブディレクトリの深さ制約を指定して実行することをお勧めします。

find . -maxdepth 1 -name '--help' -delete

これは、検索を現在のディレクトリに限定します。


移植性があるためfind、調べるファイル/ ディレクトリのリストを指定する必要があります。だからfind . -name...-deleteまた-maxdepth、標準オプションでもありません。
ステファンシャゼル

21

Vegar Nilsenとedfuhの回答は非常に優れており、このような問題に対する適切な解決策です。

私はあなたが削除することができますこの質問に対する一般的な応答を追加したい任意の困難なファイル名でファイルを。最初に、ls -iまたは何らかの形式を使用してそのiノード番号を取得しstat、次に、iノード番号で現在のディレクトリ内のファイルを検索rmし、一致するiノード番号を持つファイルでコマンドを実行することにより、ファイルを削除します

find . -inode <inode> -exec rm {}\;

iノード番号は各ファイルシステムで一意であるため、これを使用して任意のファイルを削除できます。ユニコードまたはエスケープ文字を使用します。入力するのは非常に面倒なので、行を追加することをお勧めします

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

.inputrcbashを使用している場合は、ファイルに追加します。これは、(補完候補のリストを循環することができます詳細については)。


5
この方法には2つの問題があります。1)-deleteを使用できる場合は、-exec rmを使用しないでください。:あなただけ使用することができたときに2)inodeを取得して、それを使用すると、不overcomplicatedですfind -name '--help' -delete
aculich

私はそれがうまくいくとは思わない。現在のディレクトリとそのすべてのサブディレクトリ内のすべてのファイルを走査しますが、それでも引き続き呼び出しますがrm --help、それでもファイルは削除されません。ただ、使用rm ./--help(またはrm -i *
キース・トンプソン

1
@KeithThompson findは、コマンドライン引数のパスの前にすべてのファイルを追加するためrm ./--help、and が実行されrm ./sub/dirs/--helpます。2つ目を修正するには、を追加する-maxdepth 1必要がありますが、これは本質的に@edfuhのソリューションをよりラウンドアバウトで複雑な方法で適用し、とにかく-delete安全です-exec rm
jw013

1
このコマンドのもう1つの問題は、{}との間にスペースが必要であるという\;ことです。そうしないと機能しません。
ユージンS

iノードは一意ですが、同じiノードを持つ複数のディレクトリエントリが存在する場合があります。これらはハードリンクと呼ばれます。また、ファイルシステムごとに一意であるため、を使用する必要があります-xdev。それはあなたがそれを実行するのに役立ちませんls -i --help
ステファンシャゼル


8

ダッシュとスペースを含むファイルを作成し、それを削除するLinuxウォークスルー。

注意してください!誤って、rm -rf /または同様のカスケード削除コマンドを実行しないでください。

削除しようとしているファイルは、アスタリスクまたはスラッシュが含まれている場合、誤ってポンプしていない.か、/*または*オペレーティング・システムを削除することができカスケードまたは他のいくつかのワイルドカードを。

「--yo yo」というファイルを作成します

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo

まず、findで見つけます:

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo

削除する1つのファイルのみがfindコマンドで検出されることを確認してください。

次に-deleteオプションを渡して、それらを削除します。

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  

消えました。


2

真夜中の司令官(mc)が最も簡単です。ただそれを指してF8を押してください;)


3
OPは、コマンドライン(CLI)ソリューションを必要としています。
フランチェスコターコ

1
ミッドナイトコマンダーはCLIソリューションです。パッケージマネージャーを使用してインストールするだけです。(sshでも動作します...)en.wikipedia.org/wiki/Midnight_Commander
daviewales

6
apt-get install mc || yum install mc; mc さまざまな矢印キーとF8はどのように簡単ですrm ./--helpか?
ジョシュ14

3
@daviewales:真夜中の司令官がされ始め、コマンドラインから、それが実行され、端末ではなく、真夜中の司令官内のすべてのキーボードアクションは、CLI(コマンドラインインターフェイス)からではありません-彼らは真夜中の司令官のインターフェイスからです。-通常、コマンドラインユーティリティはスクリプト内で実行できます(例外はbashコマンドライン履歴です)
Peter.O

1

このスレッドを見つける前に私が使用したソリューションがあります。ディレクトリの「編集」に
使用vim

vim .

次に(vimで)ファイルを選択し、delを押して削除を確認します。
終わったらvimを終了します:q


0

ディレクトリ名をプレフィックスとして追加しようとしましたか?

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

一般にファイルのプレフィックスとしてディレクトリを使用すると、パーサー関数によるコマンドオプションとしての「マイナス」文字の誤った解釈を回避するのに役立ちます。


1
これは以前の回答ですでにカバーされていたと思います
クサラナナンダ

-3

ファイルの名前を変更する場合は-.bar、(mvは機能しません)、これを試してください:

cat >foo.bar <-.bar

コマンドを使用する前に:

rm -- -.bar

foo.barの元のファイルの内容を調べることができるはずです


4
ファイルのコピーを作成することは、ファイル名を変更するための非常に効率的なソリューションではありません。
jw013

1
vidirを使用できます。しかし、それはおそらく非効率的(またはそれ以上)であり、はるかに危険です。
スティーブンメナシアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.