如何创建一个像命令行参数一样命名的文件?


29

我想知道如何制作一个称为标志的文件,例如,如果我想制作一个名为的文件夹-a,那么什么命令可以解决这个问题?

我尝试了mkdir '-a'mkdir \-a但均无效果。我在Ubuntu上。


13
这里的答案都很棒,但我想不出一个非
妖怪的

@evilsoup有些人喜欢为文件夹加上前缀,因此它们会停留在按字母数字排序的列表的顶部。坦白说,但这是我能想到的唯一原因。
slhck

@slhck我至少知道一门视频编辑课程,在该课程中,他们鼓励学生在项目目录中添加空格,以便他们出现在公用iMac的顶部。这很丑陋,并导致搞笑升级,但至少不会破坏系统……
evilsoup

3
通常是出于学术兴趣。
MYV 2013年

Answers:


49

像这样调用命令:

mkdir -- -a

--意味着选项在此之后结束,因此-aget会按字面意义进行解释,而不是作为的选项mkdir。你会发现这种语法不仅在mkdir,但除了任何POSIX兼容的工具echotest从规格

参数-应该作为指示选项结束的定界符被接受。以下任何自变量都应视为操作数,即使它们以'-'字符开头。-参数不能用作选项或操作数。

--建议在几乎所有处理文件名并希望确保它们不会破坏命令的操作中都使用安全保护措施,例如,在循环移动文件时,您可能需要调用以下内容,以使名为的文件为-i“ 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命令,例如上面迈克尔给出的命令,该命令-o可以指定输出文件。
slhck

1
循环示例说明了为什么您应始终使用类似for f in ./*; do...而不是for f in *; do...
evilsoup

21

适用于任何合理程序的最简单方法是在前面使用相对路径名-,例如,mkdir ./-a-a在当前工作目录中创建一个名为目录的目录。

使用此“技巧”的最常见示例是当您要删除以破折号开头的文件时,可以这样做rm ./-a


3
当然,这仅在您使用文件路径而不是解析为字符串的任何命令行选项时才有用。但是,否则前缀./总是一个好主意-想象您创建了一个文件-rf,然后又调用了rm *
slhck

1
@slhck对许多可能看起来是在开玩笑的人。但是我已经看到了足够多的情况,这种情况使服务器(一部分)消失了。对于以破折号开头的文件,您无法向人们发出足够的警告。我曾在一个地方工作过,这是一条正式规则:永远不要创建名称以“ -f”或“ -r”开头的文件。
托尼

1
这应该是答案:这是唯一可移植的方式(--并非每个命令都了解,只有少数几种)
Olivier Dulac

@OlivierDulac我以为这--是一回事,所以它应该适用于所有程序?
gsingh2011 2013年

@ gsingh2011否,决定“-”是否被视为“标志结束”标记的代码存在于应用程序中,并且由每个应用程序决定是否以这种方式对待它。
阿莫斯·夏皮拉

4

mkdir '-a'或之所以mkdir \-a不起作用的原因是,这两种方法(使用引号或反斜杠)均用于防止您的外壳(可能bash)从给他们任何特殊含义。由于-a无论如何对shell来说并没有什么特别的意义,因此这些对它如何传递给都没有影响mkdir

就其mkdir而言,它从shell接收到一个参数列表,并且它无法告诉您是否将它们放在引号中,或者是否存在反斜杠。它只看到一个论点-a。这就是为什么您需要--其他答案中说明的原因。


-3

除了“ slhck”的答案之外,还有另一个技巧有时会起作用:

将有问题的文件名放入2组(不同的)qout中,例如"'-a'"'"-a"'

是否可行取决于程序,但是如果程序不支持POSIX --功能,则是不得已的方法。
始终首选POSIX方法,因为它是100%可靠的。


“ POSIX方法始终是首选,因为它是100%可靠的。” 使用--终止选项处理还假定您不需要任何选项来跟随文件名,这种情况并非总是如此。
CVn

@MichaelKjörling当然...但是我认为那是显而易见的。
托尼

4
这将至少在BSD类型的系统上创建一个名为'-a'或的文件"-a"
nohillside 2013年

4
你能举一个OS /壳,其中该的工作?
nohillside

1
如果它确实起作用,则似乎在处理带有引号引起来的文件时会遇到一个相当大的问题。
muhmuhten
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.