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

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

我有一个文件目录,

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

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

for f in *.png; do mv $f ${f#image}; done

这看起来不错。我无法弄清楚该#字符的作用(我假设它从文件名中删除了字符串“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

等等所有文件。

答案1

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

  • ${var#word}var删除最短前缀:删除前缀word(如果有)的变量的值;

  • ${var%word}var删除最短后缀:删除后缀的变量值word(如果有)。

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

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

因此,在您的示例中,扩展为(例如 )${f#image}的值,并删除前缀,因此它会产生值 。fimage01.pngimage01.png

扩展中的word和部分与文件名具有相同的通配符扩展;因此,如果要删除空格 和,可以使用 ( 将任何出现的字符和替换为空字符串。replacement${...}-${f//[ -]/}-

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

答案2

如果你有 perl rename(例如,因为你使用的是 Debian 或 Ubuntu),这是给这只特定的猫剥皮的最简单的方法(就像在一只单独的猫中一样——有很多工具可以进行大规模重命名,并搜索该站点的档案)和超级用户应该找到所有主要的)。

rename 's/[- ]//g' *.xml

话虽这么说,如果您遵循最重要的 shell 编程原则,您的脚本就会起作用:所有变量替换都必须用双引号引起来。 (为什么你需要这些额外的语法错误?因为在某些情况下你实际上想要不带引号的行为。但这些情况相当罕见。)

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

使用 zsh,您不需要编写循环:您可以使用方便的zmv函数。

autoload zmv
zmv '(*.xml)' '${1//[- ]/}'

答案3

您还可以使用 sed 来构建新名称。那里将会是

for i in *.xml; do mv "$i" `echo "$i" | sed -e "s/[ -]//g"`; done

相关内容