我有一个文件目录,
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}
的值,并删除前缀,因此它会产生值 。f
image01.png
image
01.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