Unixマシンにいくつかのファイルが
--
例えば--testings.html
それを削除しようとすると、次のエラーが発生します。
cb0$ rm --testings.html
rm: illegal option -- -
usage: rm [-f | -i] [-dPRrvW] file ...
unlink file
私は試した
rm "--testings.html" || rm '--testings.html'
しかし、何も機能しません。
ターミナルでそのようなファイルを削除するにはどうすればよいですか?
rm -- --testings.html
--
オプションは、それらが-
で始まっていても、それ以降のすべての引数をオプションではなくファイル名として扱うようにrmに指示します。
これはrmコマンドに固有のものではありません。 getopt関数はそれを実装し、多くの(すべて?)UNIXスタイルのコマンドはそれを同じ方法で処理します。--
はオプション処理を終了し、それ以降は通常の引数です。
http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt
_rm -- --somefile
_
これは機能しますが、オプションの解析にgetoptsを使用するrm
に依存するソリューションです。独自の解析を行い、それを利用するアプリケーションもあります(「_--
_はオプションの終わりを意味する」ロジックを必ずしも実装していない可能性があるため)。
そのため、頭蓋骨を通過する必要がある解決策は次のとおりです。
_rm ./--somefile
_
この方法では、引数が_-
_で始まることはないため、常に機能します。
さらに、本当に適切なシェルスクリプトを作成しようとしている場合は、技術的には、すべてのファイル名パラメーター展開の前に_./
_を配置して、ファンキーなファイル名入力が原因でスクリプトが壊れないようにする(または、想定されていないことを行うためにスクリプトが悪用または悪用されるのを防ぐ)必要があります。たとえば、rm
はファイルを削除しますが、ディレクトリはスキップしますが、_rm -rf *
_はすべてを削除します。「_-rf
_」のファイル名をスクリプトまたは誰かに渡すと、_touch ~victim/-rf
_このようにして、その動作を変更し、本当に悪い結果をもたらすことができます。
rm -- --testings.html
またはrm ./--testings.html
。
rm -- --testings.html
それを行うさらに別の方法は、find ... -name "-*" -deleteを使用することです
touch -- --file
find -x . -mindepth 1 -maxdepth 1 -name "--*" -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の助けを借りて:
$ find ./ -inum 452998712 -exec rm \{\} \;
このプロセスは、簡単にスクリプト化できるため、ファイル名に特殊性がある多くのファイルを処理する場合に役立ちます。
rm ./--testings.html
または
rm -- --testings.html