4

我有一系列文件,我想使用 *nix 系统上可用的命令行工具进行清理。现有文件的名称如下。

filecopy2.txt?filename=3
filecopy4.txt?filename=33
filecopy6.txt?filename=198
filecopy8.txt?filename=188
filecopy3.txt?filename=19
filecopy5.txt?filename=1
filecopy7.txt?filename=5555

我希望将它们重命名,删除所有字符,包括“?”。

filecopy2.txt
filecopy4.txt
filecopy6.txt
filecopy8.txt
filecopy3.txt
filecopy5.txt
filecopy7.txt

我相信以下正则表达式会抓住我想从名称中删除的部分,

\?(.*)

除此之外,我只是不知道如何完成这项任务。

4

5 回答 5

3

如果所有文件都在同一个目录中(忽略.dotfiles):

$ rename -n 's/\?filename=\d+$//' -- *

如果要在目录层次结构中递归地重命名文件:

$ find . -type f -exec rename -n 's/\?filename=\d+$//' {} +

删除-n选项,进行重命名。

于 2013-06-07T21:50:07.463 回答
3
find . -depth -name '*[?]*' -exec sh -c 'for i do
  mv "$i" "${i%[?]*}"; done' sh {} +

zsh

autoload zmv
zmv '(**/)(*)\?*'  '$1$2'

将其更改为:

zmv -Q '(**/)(*)\?*(D)' '$1$2'

如果您还想重命名点文件。

请注意,如果文件名可能包含多个?字符,则两者都只会从最右边的一个开始修剪。

于 2013-06-07T20:59:50.210 回答
3

一个 bash 命令:

for file in *; do
  mv $file ${file%%\?filename=*}
done
于 2013-06-07T21:01:13.550 回答
1

在这种情况下,您可以使用cut命令:

echo 'filecopy2.txt?filename=3' | cut -d? -f1

例子:

find . -type f -name "*\?*" -exec sh -c 'mv $1 $(echo $1 | cut -d\? -f1)' mv {}  \;

如果你有它,你可以使用重命名:

rename 's/\?.*$//' *
于 2013-06-07T21:12:51.643 回答
0

我在下载了一堆 URL 包含参数并且这些参数以文件名结尾的文件后使用它。

这是一个 Bash 脚本。

for file in *; do
  mv $file ${file%%\?*};
done
于 2013-12-15T21:48:34.130 回答