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

Svi*_*ish 21 unix bash rename

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

我发现下面这行应该有效,但由于它是破折号,它没有:

for file in -N*.ext; do mv $file x$file; done
Run Code Online (Sandbox Code Playgroud)

如果我echo在前面放一个,mv我会得到一堆

mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext
Run Code Online (Sandbox Code Playgroud)

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

mv: illegal option -- N
Run Code Online (Sandbox Code Playgroud)

我试图将其更改为

for file in -N*.ext; do mv "$file" "x$file"; done
Run Code Online (Sandbox Code Playgroud)

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

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

for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done
Run Code Online (Sandbox Code Playgroud)

当我回应它时,它看起来是正确的,但是当我实际运行它时,我只是得到

mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我现在不知道该怎么做...叹气

qua*_*ote 33

您需要使用关键字--来告诉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
Run Code Online (Sandbox Code Playgroud)

在命令行上的所有选项-- 之后使用。例如,如果您尝试使用mv-i选项,它会在之前 --

mv -i -- -filename-begins-with-dash newfilename
Run Code Online (Sandbox Code Playgroud)

  • 啊啊。完全没想过那个。与此同时,我发现我也可以在文件名前面加上 `./`,这会起作用。但这当然是一个更简洁的选择:) (7认同)
  • 请注意,`--` 表示不处理进一步的参数,因为选项是一种约定,并非所有程序都遵守。有些人为此使用单独的`-`,有些人不接受*任何*。所以在前面加上`./` 是值得记住的。 (7认同)

Doc*_*ger 7

另一种技术是包含具有文件名的父目录...

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

mv  ../parent-dir/-file-to-rename  file-to-rename
Run Code Online (Sandbox Code Playgroud)

谢谢@Skippy le Grand Gorou。证实./-file-to-rename与工作mvrm在...

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

rm  ./-file-to-rename
Run Code Online (Sandbox Code Playgroud)