我有一堆文件从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 /等等。
答案 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, =~
)。