2009-04-01 6 views
66

私はダブルハイフンで始まるファイルを削除するには?

-- 

たとえばで始まる私のUnixマシン上のファイルをいくつか持っています--testings.html

私はそれを削除しようとすると、私は次のエラーを取得する:

cb0$ rm --testings.html 
rm: illegal option -- - 
usage: rm [-f | -i] [-dPRrvW] file ... 
     unlink file 

私は

rm "--testings.html" || rm '--testings.html' 

を試してみましたが、何も働きません。

端末でこのようなファイルを削除するにはどうすればよいですか?

+0

[serverfault](https://serverfault.com/questions/47003/deleting-a-unix-directory-with-a-hyphen-in-the-name)と[unix](https:// unix.stackexchange.com/questions/1519/how-do-i-delete-a-file-whose-name-begins-with-hyphen-aka-dash-or-minus)。 – Dorian

+1

@Dorianよくわかりましたが、私は最初でした:) – cb0

答えて

140
rm -- --testings.html 

--オプションは、彼らが-で始まっていても、いないオプションとして、ファイル名としてさらなるすべての引数を処理するために、RMを伝えます。

これはrmコマンドに特有の問題ではありません。 getopt関数はそれを実装しています。多くの(すべて?)UNIXスタイルのコマンドは、同じように扱います。--はオプション処理を終了し、その後は何も正規の引数です。

http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt

+0

正確に何が必要なのですか? – cb0

+4

これはほとんどのもので動作しますが、これはUnixの全バージョンで標準ではありません。すべてのバージョンで動作する代替方法については、vatineの回答を参照してください。 –

17

rm -- --testings.htmlまたはrm ./--testings.htmlのどちらか。

1
rm ./--testings.html 

または

rm -- --testings.html 
55
rm -- --somefile 

それは動作しますが、それは、そのオプションを解析するためにgetoptsはを使用してrmに依存しているソリューションです。そこには、独自の構文解析を行うアプリケーションがあります(これは必ずしも "--オプションの終わりを意味する"ロジックを実装していない可能性があるためです)。

そのため、あなたがあなたの頭蓋骨をドライブすべきソリューションは、このいずれかになります。

rm ./--somefile 

この方法は、あなたの引数は-で始めたことがないので、それは常に、動作します。

さらに、本当にまともなシェルスクリプトを作成しようとしている場合は、技術的には、./をすべてのファイル名のパラメータ拡張の前に置いて、ファイル名の入力が狂ったためにスクリプトが壊れるのを防ぐ必要があります(または悪用されたり悪用されたりしないようにする:例えばrmファイルを削除しますが、ディレクトリをスキップしますが、rm -rf *はすべてを削除します。touch ~victim/-rfのファイル名を "-rf"にすると、実際に悪い結果が出るように変更することができます。

+2

+1あなたが正しいので、しかし、スクリプトを弾丸にすることは、1つの厄介なファイル名を扱うこと以外には全く別の問題です。質問が「ハイフンで始まるファイル、またはスペース、;、$、その他の悪意のある迷惑メールから始まるファイルを削除するにはどうすればよいでしょうか?」という完全な答えが必要です: –

4

これを行うもう1つの方法は、findを使用することです。-name「 - *」ファイル名に不可能の文字を含むファイルを削除するためのより一般的なアプローチについては

touch -- --file 
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete 
3

-delete、1つのオプションは、ファイルのiノードを使用することです。

ls -iで取得できます。

$ ls -lai | grep -i test 
452998712 -rw-r--r-- 1 dim dim  6 2009-05-22 21:50 --testings.html 

、検索の助けを借りて、それを消去する:

$ find ./ -inum 452998712 -exec rm \{\} \; 

をファイル名の特殊性を持つファイルの多くを扱うとき、それは簡単にスクリプト化することができ、このプロセスは、有益であり得ます。

+1

これは 'rm'を引数 './-- testings.html'。 'rm ./-- testings.html'を直接入力するほうが簡単です。ディレクトリツリー全体を走査する必要もありません。 ( '-maxdepth 1'を使って後者を避けることができます)。 –

関連する問題