不使用 **rename** 命令重命名文件

Vas*_*ass 5 shell shell-script

我有一个文件目录,

Measurements Panama 2009-03-22 Session1.xml
Measurements Panama 2009-03-22 Session2.xml
Measurements Panama 2009-03-22 Session3.xml
Measurements Panama 2009-03-22 Session4.xml
...
Measurements Panama 2009-03-22 Session10.xml
Run Code Online (Sandbox Code Playgroud)

我想删除空格和-破折号。我不想使用重命名命令,因为我不知道 perl 或正则表达式。从另一篇文章中删除部分文件名的建议是:

for f in *.png; do mv $f ${f#image}; done
Run Code Online (Sandbox Code Playgroud)

这看起来不错。我无法弄清楚该#字符的作用(我假设它从文件名中删除了字符串“image”?),无论如何 - 我如何删除空格和破折号?

执行时出现文件不是目录的错误

[jings]s0128943: for f in *.xml; do mv $f ${f//[ -]/};done

mv: target `MeasurementsPanama20090322Session10.xml' is not a directory

mv: target `MeasurementsPanama20090322Session1.xml' is not a directory
Run Code Online (Sandbox Code Playgroud)

等所有文件。

Ric*_*rri 6

您可以${...}在 shell 的手册页中找到替换信息,例如bash(1)。最普遍的:

  • ${var#word}除去最短前缀:变量的值var与所述word前缀(如果有的话)中除去;

  • ${var%word}除去最短后缀:变量的值var与所述word后缀移除(如果有的话)。

  • ${var/pattern/replacement} 删除第一次出现的模式

  • ${var//pattern/replacment} 删除所有出现的模式

因此,在您的示例中,${f#image}扩展为f(eg, image01.png) 删除image前缀的值,因此它产生值 01.png

扩展中的wordreplacement部分${...}受制于与文件名相同的通配符扩展;因此,如果你想删除空格和-,你可以使用${f//[ -]/} (替换任何出现的字符-空字符串。

手册页上的所有详细信息。

  • @Vass 由于您的文件名包含空格,您需要引用它们,否则 shell 将扩展 `$f` 以分隔单词 `Measurements`、`Panama` 等,从而使 `mv` 认为你想要移动文件 ` Measuremens`、`Panama` 等合并到一个单一的`MeasurementsPanama...` 中,它必须是一个目录。在 *.xml 中使用 `for f; do mv "$f" "${f//[ -]/}"; 完成`代替。(另请参阅吉尔斯的回答。) (2认同)