コマンドライン引数のような名前のファイルを作成する方法は?


29

たとえば、という名前のフォルダーを作成したい場合-a、どのコマンドがトリックを実行しますか?

、、を試しましたmkdir '-a'mkdir \-a、どちらも機能しませんでした。私はUbuntuを使用しています。


13
ここでの答えはすべて素晴らしいですが、私はこれをやりたい非トロールの理由を考えることはできません
...-evilsoup

@evilsoup一部の人々は、アルファベット順にソートされたリストの一番上にとどまるように、フォルダーにプレフィックスを付けることを好みます。しかし、それが正直に言うと、私が考えることができる唯一の理由です。
slhck

@slhck少なくとも1つのビデオ編集コースを知っています。そこでは、学生がプロジェクトのディレクトリに空白を追加して、共同iMacの一番上に表示されるようにします。
これはく

3
ほとんどの場合、これは学術的な関心のためです。
MYV

5
義務コミック:beesbuzz.biz/d/20110224.php
ふわふわ

回答:


49

次のようにコマンドを呼び出します。

mkdir -- -a

これ--は、オプションがその後で終了することを意味するため、-aのオプションとしてではなく、文字どおりに解釈されますmkdir。この構文は、だけでなくmkdirechoおよびを除くPOSIX準拠のユーティリティにもありtestます。仕様から

引数-は、オプションの終わりを示す区切り文字として受け入れられるべきです。次の引数は、「-」文字で始まる場合でもオペランドとして扱われる必要があります。-引数をオプションまたはオペランドとして使用しないでください。

使用して--次を呼び出すこともできますループ内でファイルを移動する際に安全装置を使用すると、ファイル名に対処し、彼らはコマンドを壊さないようにしたい、ほぼすべての行動、例えばのために推奨されるようにと呼ばれるファイルという、-i「ISN t(in?)オプションとして正しく解析されます:

mv -- "$f" new-"$f"

このアプローチの欠点は、オプション処理を終了することです。単純なmkdirの例の場合、それは驚くほど機能します。コマンドラインでファイル名を追跡するオプションが実際に必要な場合は、まったく機能しません。
CVn

1
もちろん、すべてにマイナス面があります。オプションが散在するファイル名を扱う場合、Amosのソリューションは、私が考えることができる唯一の正気な代替手段になりますが、それは本当にツールがオプションを解析する方法に依存します。
slhck

1
OPは「コマンドライン引数のような」名前(ハイフンで始まる名前を意味すると仮定します)でファイルを作成することについて話しているので、それが完全に不合理な仮定だとは思いません。cc -o -myfile -Wall -myfile.cほんの少し工夫された例として考えてください。その塩に値するエディタは、-myfile.cあなたがそれを要求した場合、名前の付いたファイルに保存できるはずですが、Cコンパイラはおそらくそのようなオプションのリストを与えられたときにあなたが望むことをしないでしょう。
CVn

1
@Maksimたとえば、cc上記のMichaelが-o出力ファイルを指定するオプションを持つコマンドのように、入力または出力ファイル名を設定するオプションを必要とするコマンドの場合。
slhck

1
あなたはいつものようなものを使うべき理由をループ例があるfor f in ./*; do...のではなくfor f in *; do...
evilsoup

21

合理的なプログラムで動作する最も簡単な方法は、の前に相対パス名を使用することです-。たとえば、現在の作業ディレクトリでmkdir ./-a呼び出されるディレクトリを作成します-a

この「トリック」を使用する最も一般的な例は、ダッシュで始まるファイルを削除する場合ですrm ./-a


3
もちろん、ファイルパスで作業している場合にのみトリックを行い、文字列として解析される任意のコマンドラインオプションは使用しません。ただし、そうでない場合./は、プレフィックスを付けることは常に良い考え-rfですrm *。というファイルを作成してからを呼び出したと想像してください。
slhck

1
@slhck冗談に見えるかもしれない多くの人々に。しかし、この種のものがサーバー(の一部)を一掃した十分なケースを見てきました。ダッシュで始まるファイルの危険性について人々に十分に警告することはできません。私が働いていた場所の1つは公式のルールとしてもありました。名前が「-f」または「-r」で始まるファイルを作成しないでください。
トニー

1
これが答えであるはずです:それは唯一のポータブルな方法です(--すべてのコマンドで理解されているわけではなく、ほんの少数です)
オリヴィエデュラック

@OlivierDulacこれ--はバッシュだと思ったので、すべてのプログラムで動作するはずです。
gsingh2011

@ gsingh2011いいえ、「-」を「フラグの終わり」マーカーと見なすかどうかを決定するコードはアプリケーション内に存在し、そのように処理するかどうかを決定するのは各アプリケーション次第です。
アモスシャピラ

4

理由mkdir '-a'、またはmkdir \-aこれらの方法(引用符やバックスラッシュを使用)の両方をご防ぐために使用されているので、仕事があるしないシェルを(おそらくbash彼らに特別な意味を与えることから)。-aとにかくシェルにとって特別なことを意味するものではないため、これらはシェルに渡される方法には影響しませんmkdir

mkdir懸念される限り、シェルから引数のリストを受け取ります。引数を引用符で囲んでいるかどうか、またはバックスラッシュがあったかどうかはわかりません。ただ1つの議論を見ています-a。そのため--、他の回答で説明されているように必要です。


-3

「slhck」からの答えに加えて、時には機能する別のトリックがあります。

"'-a'"またはのような2組の(異なる)qoutes内に問題のファイル名を入れます'"-a"'

これが機能するかどうかはプログラムによって異なりますが、プログラムがPOSIX --機能をサポートしていない場合は最後の手段です。
POSIX方式は100%信頼性があるため常に推奨されます。


「POSIX方式は100%信頼できるため、常に優先されます。」--また、オプション処理を終了するために使用すると、ファイル名の後にオプションが不要であると想定されますが、常にそうであるとは限りません。
CVn

@MichaelKjörlingもちろん...しかし、私はそれが明らかであると思いました。
トニー

4
これにより、少なくともBSDタイプのシステムでは'-a'or というファイルが作成されます"-a"
-nohillside

4
これ機能するOS /シェルを引用できますか?
-nohillside

1
うまくいった場合は、引用符で囲まれた名前のファイルを扱う際にかなり重大な問題があるように思われます。
-muhmuhten
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.