「-」のように、名前がハイフンのみのように見えるLinuxでファイルを削除するにはどうすればよいですか


33

私はもう試した

rm -- -
rm "-"
rm "\-"
rm \-

Perlに打撃を与えた

~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `rm $junk`;'
-
rm: cannot remove `-': No such file or directory

...そして...

~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `mv $junk newfile.garbage`;'
-
mv: cannot stat `-': No such file or directory

賢明な人々、どんな援助も大歓迎です。


好奇心から、どのようにしてそこにたどり着きましたか?
ピティB

2
それは不十分に構築されたwgetの結果でした: "wget -q -O – someserver.org/s/ip "

53
同僚が*という名前のファイルを作成したことを思い出します。この話はうまく終わりませんでした。
デビッドヘファーナン

どのrmバージョンを使用していますrm --versionか()?rm -GNU coreutils 8.5で正常に動作します。
-Lekensteyn

2
別のバリアント:rm ./-
CVn

回答:


60

これは、UnixのUsenet FAQに投稿されていました。GNUCore Utility FAQにあります。少なくとも5つの異なる方法がありましたが、これはうまく機能します。

$ rm ./-

ファイル名に入力できない文字が含まれている場合は、次を使用します。

$ rm -i *

-iそれは削除するかどうフラグは、各ファイルの確認を求めます。


1
またはRM -i - 「-」あなたはダッシュを含むファイルと、おそらくいくつかのスペースまたは何を探している場合。
ハンスピーターシュトルー

1
rm -i *も役立った。ありがとう、wallyk!
jgrundstad

39

名前がで始まるファイルを削除するの-はよくある質問ですが、別の問題があるようです。

あなたが質問で言及した解決策のうち:

rm -- -

それはうまくいくはずです。

rm "-"

それはから違いはありませんrm -。引用符はシェルによって削除され、rmコマンドは引数として単一のハイフンを見るだけです。引用符は、シェルのメタキャラクターをエスケープするのに役立ちます。ハイフンはrm、シェルではなくに特別です。

rm "\-"

引用符はバックスラッシュをエスケープするため、名前がバックスラッシュとハイフンの2文字で構成されるファイルを削除しようとします。

rm \-

これはのようなものでrm "-"、と同等rm -です。

たまたま、少なくともGNU coreutilsバージョンのではrmrm -名前がハイフンだけで構成されているファイルを実際に削除します(または削除しようとします)。ファイルにその名前が付けられていた場合、そのファイルはもう消えています。ファイルの名前はハイフンのように見えるだけだと思います。

ls | cat -A

それが本当に何と呼ばれているのかのアイデアを与える必要があります。

これは、私が一緒に投げたPerlスクリプトで、現在のディレクトリにある各ファイルの入力を求め、それを削除するかどうかを尋ねます。保証なしで提供されますが、簡単にテストしました。

#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

opendir my $DIR, '.' or die ".: $!\n";
my @files = sort grep { -f $_ } readdir $DIR;
closedir $DIR;

foreach my $file (@files) {
    print "Remove $file? ";
    my $answer = scalar <>;
    if ($answer =~ /^[Yy]/) {
        unlink $file or warn "$file: $!\n";
    }
    elsif ($answer =~ /^[Qq]/) {
        exit 0;
    }
}

編集:それほど複雑ではない解決策:ファイルの名前が1文字だけの場合は、rm ?(他の同様のファイルと一緒に)それを削除する必要があります。


13
M-bM-^@M-^SUnicode「EN DASH」文字の0x2013の3バイトUTF-8表現のレンディションです。Webページから誤ってコピーアンドペーストしたのではないかと思います。
キーストンプソン

7
動作しrm -i *ませんでしたか?perlスクリプトと同じことをするようです。
user606723

2
これは、wgetをポイントしたWebページに由来すると推測しています。いずれにせよ、徹底的な解決策に再び感謝します!世話をする。
jgrundstad

5
perl -e 'grepのリンクを解除{print "remove $ _?"; <STDIN> =〜/ y / i} glob "*" '
ランダルシュワルツ

6
@RandalSchwartz:驚くほど簡潔です(そして、私の脳を少し傷つけます)-しかし、私は/^y/iむしろむしろ欲しいです/y/i。結局のところ、ロシアのユーザーは「Nyet」と入力する可能性があります。
キーストンプソン

19

より安全なものが必要な場合...

lsとfindの組み合わせを使用してみてください(これは、削除する権限があるすべてのファイルで機能します)

'-i'パラメータは、各ディレクトリエントリのiノード番号を提供しますls -li

27 ----------  1 owner  group       3981 Oct 11 04:42 ?????

iノード番号を取得したら...

find . -inum **27** -exec rm -i {} \;

2
+1は、これらの問題に対する一般的な回答として最適です。ちなみに、最近の検索では-exec rmを使用する必要はありません。
deleteを

2
@Sirex -私はポイントが思う-exec rm -i {}-i除去するためにプロンプト。私は見ているが、man findそれを行う方法がわからない。
スティーブンP

そうそう、この場合。より多くのヒントでした。
Sirex

13

与えるrm ./-試みを。

-フラグ引数を開始するためのフラグです。引数をa以外で始める-と、この場合/、それはファイル名であると想定されます。それはあなたが望むものです。

そして以来file./file同じファイルです、それは名前のファイル対象となります-経由します./-


8
むしろ30個の文字を入力するよりも、おそらく/を正しく構文解析に役立つ理由を説明する方が便利だっただろう
イヴォFlipse

@gcb編集案をありがとう。コードマークアップを追加したので、読みやすくなりました。
slhck

7

他のほとんどの答えほどオタクではありませんが、私はのインスタンスを起動しmc、真夜中の司令官で、ファイルを選択して削除するだけです。


+1-問題を巧みに回避し、GUIプログラムに頼らなくても問題ありません。
-sleske


6

ここでperlを使用する必要があるわけではありませんが、これは機能するはずです。

perl -e 'unlink "-"'

または、上記のエラーの内容を確認するには:

perl -e 'unlink "-" or die "Err: $!"'

この方法には、(文字列の引用の問題以外に)心配する特別な文字がないという利点があります。
ケビンリード

3

GNOMEのNautilusを使用して、名前の不適切なファイルを削除できました。Xサーバーを実行していますか?他のファイルブラウザーでも動作するはずです。


3

もし

rm -- -

動作しませんでした、ファイル名は「単なるハイフン」ではありません。他のファイルにハイフンが含まれていない場合は、試すことができます

perl -E'for (@_) { if (/-/) { unlink($_) or die $! } }' -- *

1

これまでのところ、これまでに投稿されたすべてのメソッドに対して「No such file or directory」が表示されます。

rm ./-
rm -- -
mv "-" test.txt
rm -rf '-' <-- this gives no error, but doesn't work
perl -e 'unlink "-";'  <--also no error, doesn't work.

rmバージョン7.4を持っているようです。これらの提案をアップグレードして再試行してみます。手伝ってくれてありがとう。


1
そのようなファイルやディレクトリはなく、ファイル名にも目に見えない文字が含まれていると思われます。(また、 'unlink "-"またはdie "Err:$!"'でperlに同じエラーメッセージが表示される可能性があります)。「ls -b」を試して、実際のファイル名を確認してください。
runrig

1

私はdiredこの種のことのためにemacsでモードを使うのが大好きです-emacsでディレクトリを「開く」だけです。ファイルを簡単に選択し、削除用にマークすることができます。

別のポスターは、真夜中の司令官の使用を提案しました。これはほとんど同じ考えですが、すでにemacsユーザーである場合は、おそらくより便利です。


0

rm -f '-'cygwinで私のために働くことができるはずです

そのことについては、rm -赤い帽子でも動作するようです。


Ubuntuの場合:〜/ jj $ rm -rf '

rm -私にも使える。
-uzsolt

1
なぜ-rですか?不要な場合に再帰的な削除を要求することは、つづりの間違いの場合には常に危険です。
ハンスピーターシュトルー

@hstoerr、良い点。ただのウサギ。手は脳よりも速くタイプします。編集レスポンス、ありがとうございます。
ルーカス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.