web-dev-qa-db-ja.com

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

私はもう試した

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

賢明な人々、どんな援助も大いに感謝されるでしょう。

33
jgrundstad

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

$ rm ./-

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

$ rm -i *

-iフラグは、ファイルを削除する必要があるかどうかの確認を各ファイルに要求します。

60
wallyk

名前が-で始まるファイルの削除はFAQですが、別の問題が発生しているようです。

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

rm -- -

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

rm "-"

それはrm -と同じです。引用符はシェルによって削除され、rmコマンドは単一のハイフンを引数として認識します。引用符は、シェルのメタ文字をエスケープするのに役立ちます。ハイフンは、シェルではなく、rmに固有です。

rm "\-"

引用符は円記号をエスケープするため、名前が円記号とハイフンの2文字で構成されているファイルを削除しようとします。

rm \-

これはrm "-"と同じで、rm -と同等です。

たまたま、少なくともGNU coreutilsバージョンのrmでは、rm -は、名前がハイフンだけで構成されているファイルを実際に削除(または削除しようとします)します) 。もしあなたのファイルがその名前を持っていたら、それはもうなくなっているでしょう。あなたのファイルはだけがハイフンのように見える名前を持っていると私は結論づけます。

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;
    }
}

[〜#〜] edit [〜#〜]:あまり複雑でない解決策:ファイルの名前が1文字だけの場合、rm ?はそれを(他のそのようなファイルと一緒に)削除する必要があります。

39
Keith Thompson

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

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

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

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

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

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

rm ./-を試してみてください。

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

また、file./fileは同じファイルであるため、-を介して./-という名前のファイルをターゲットにします。

13
Petey B

試してください:

$ ls -b

ファイル名に印刷できない文字が含まれているかどうかを確認します。

7
Noel Yap

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

7
johanvdw

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

Perl -e 'unlink "-"'

または、上記のエラーが何であるかを確認します。

Perl -e 'unlink "-" or die "Err: $!"'
6
runrig

GNOMEのNautilusを使用して、名前の悪いファイルを削除することができました。 Xサーバーを実行していますか?他のファイルブラウザも動作すると確信しています。

3
Joel Berger

場合

rm -- -

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

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

これまでのところ、これまでに投稿されたすべてのメソッドに対して「そのようなファイルまたはディレクトリはありません」というメッセージが表示されます。

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
jgrundstad

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

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

できるはずですrm -f '-'cygwinで私のために働いた

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

0
Lucas