web-dev-qa-db-ja.com

二重ハイフンで始まるファイルを削除する方法は?

Unixマシンにいくつかのファイルが

 --

例えば--testings.html

それを削除しようとすると、次のエラーが発生します。

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

私は試した

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

しかし、何も機能しません。

ターミナルでそのようなファイルを削除するにはどうすればよいですか?

66
cb0
rm -- --testings.html

--オプションは、それらが-で始まっていても、それ以降のすべての引数をオプションではなくファイル名として扱うようにrmに指示します。

これはrmコマンドに固有のものではありません。 getopt関数はそれを実装し、多くの(すべて?)UNIXスタイルのコマンドはそれを同じ方法で処理します。--はオプション処理を終了し、それ以降は通常の引数です。

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

141
Steve Jessop
_rm -- --somefile
_

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

そのため、頭蓋骨を通過する必要がある解決策は次のとおりです。

_rm ./--somefile
_

この方法では、引数が_-_で始まることはないため、常に機能します。

さらに、本当に適切なシェルスクリプトを作成しようとしている場合は、技術的には、すべてのファイル名パラメーター展開の前に_./_を配置して、ファンキーなファイル名入力が原因でスクリプトが壊れないようにする(または、想定されていないことを行うためにスクリプトが悪用または悪用されるのを防ぐ)必要があります。たとえば、rmはファイルを削除しますが、ディレクトリはスキップしますが、_rm -rf *_はすべてを削除します。「_-rf_」のファイル名をスクリプトまたは誰かに渡すと、_touch ~victim/-rf_このようにして、その動作を変更し、本当に悪い結果をもたらすことができます。

55
lhunath

rm -- --testings.htmlまたはrm ./--testings.html

17
Vatine
rm -- --testings.html
7
Juliano

それを行うさらに別の方法は、find ... -name "-*" -deleteを使用することです

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

ファイル名に不可能な文字を含むファイルを削除するためのより一般化されたアプローチの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の助けを借りて:

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

このプロセスは、簡単にスクリプト化できるため、ファイル名に特殊性がある多くのファイルを処理する場合に役立ちます。

3
Dimitris
rm ./--testings.html

または

rm -- --testings.html
1
Paul Smith