如何通过正则表达式重命名批量文件?

时间:2016-11-18 01:52:25

标签: bash shell file unix wget

我有一堆文件从wget操作中吐出来。许多人都有这样的文件名:

bootstrap.min.css?v=30cad4497c.css
font-awesome.min.css?v=30cad4497c.css
screen.css?v=30cad4497c.css

是的,这些是文件名,问号和等号等等。

我知道?v=30cad4497.css内容出现的原因。如何在"?"之后重命名所有文件以删除所有内容。字符?

我很乐意为此编写几行shell脚本,但我不想破坏python / node / ruby​​ /等等。

2 个答案:

答案 0 :(得分:3)

在bash中:

for file in *[?]* ; do mv $file ${file%%[?]*} ; done

*[?]*表示文件名中包含问号的匹配文件。 ${file%%glob}表示删除与字符串末尾匹配的所有文本${file##glob}表示删除与字符串开头的glob匹配的所有文本。请注意,这些是文件globs ,而不是正则表达式。文件globs是我们经常用来匹配bash文件的。

答案 1 :(得分:3)

Danny Daglas' answer适用于手头的特定文件名,但是,为了一般的健壮性,变量引用应该是双引号 以确保它们'重复使用(以保护他们的价值不受shell expansions):

for file in *\?* ; do mv "$file" "${file%%\?*}"; done

另请注意我是如何使用 \?来匹配文字 ? ,因为它是意图的更直接表达 - 虽然使用只有一个元素([?])的字符 set 也可以。

有关使用Pattern Matching Notation的说明:

  • 正如Danny所说,模式虽然距离很远,但是不是正则表达式(正则表达式),上面指向POSIX规范的链接描述了它们的特定语法。

  • pathname expansion (globbing)中的模式不仅 parameter expansion 中的 ,其中${file%%\?*}就是一个例子:

    • %% - 与%相对 - 从$file的值中删除与模式相匹配的最长后缀如下。
    • 至少对于只包含一个?的示例输入,通过%剥离最短后缀也会起作用(${file%\?*})。

请注意,%%等参数扩展中使用模式是路径名扩展(globbing)的独立 ,如下例所示: / p>

$ foo='bar'; echo "${foo%a*}"
b  # suffix 'a' followed by any chars. stripped

此外,在Bash(和Ksh和Zsh)中您还可以在==运算符的RHS上使用模式(请注意,这不是POSIX标准的一部分):< / p>

$ [[ foo == 'f'* ]] && echo YES
YES

请注意*等模式元字符必须不加引号才能被识别(类似于regex-matching operator, =~)。