Unix:以破折号开头的文件-


19

好的,我有一堆以破折号-开头的文件。不太好...我想重命名它们。在我的特定情况下,我只想在他们前面放一个角色。

我发现下面的行应该起作用,但是由于它破折号而不起作用:

for file in -N*.ext; do mv $file x$file; done

如果我echo在前面放mv一串

mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext

这是正确的,除了当然会认为第一个文件名是选项。因此,当我删除echo并运行它时,我得到的只是一堆

mv: illegal option -- N

我试图将其更改为

for file in -N*.ext; do mv "$file" "x$file"; done

但似乎只是忽略了引号。试图使用单引号,但随后该变量未扩展...我在这里做什么?

更新:我现在也尝试引用引号。像这样:

for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done

当我回显它时,它看起来正确,但是当我实际运行它时,我得到了

mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory

我刚才不知道如何做到这一点,现在... 叹息


Answers:


28

您需要使用关键字--来告诉mv命令,不要将参数解释为选项。看:

$ mv -N1.ext x-f1.ext
mv: invalid option -- N
Try `mv --help' for more information.

$ mv -- -N1.ext x-f1.ext
$ ls
x-f1.ext

在命令行上的所有选项-- 之后使用。例如,如果您尝试使用-i选项mv,它将在执行以下操作 --

mv -i -- -filename-begins-with-dash newfilename

6
啊啊 根本没有考虑过那个。在此期间,我发现我也可以粘贴./在文件名前面,这将起作用。但这当然是一个更整洁的选择:)
Svish

@Svish:公平,我没想到要在文件名前加上./任何一个。但您是正确的,在这种情况下也可以使用。
奎克吉

7
请注意,--含义不处理其他参数,因为选项是约定俗成的,并非所有程序都遵循。有些人-为此使用了孤独,而有些人则不接受任何东西。因此,前置./是值得记住的。
dmckee,2010年

@dmckee是正确的;--作为一个特殊的参数是GNU扩展,但是在POSIX准则中已提及。请参阅第12.2节,准则10:opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ...这意味着您可以期望大多数POSIX和GNU实用程序都遵守该约定,但其他人可能不遵守该约定。
奎克吉x德

6

另一种技术是在父目录中包含文件名...

要将文件'-file-to-rename'重命名为'file-to-rename'...

mv  ../parent-dir/-file-to-rename  file-to-rename

谢谢@Skippy le Grand Gourou。确认./-file-to-re-rename可以mvrm... 一起使用...

mv  ./-file-to-rename  ./--file-to-rename

rm  ./-file-to-rename

1
或更好的方法,如在quack quixote答案的注释中已经提到的那样./
Skippy le Grand Gourou 2014年
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.