2

我有名称格式为“NAME-xxxxxx.tedx”的文件,我想删除“-xxxxxx”部分。x 都是数字。正则表达式"\-[0-9]{1,6}"匹配子字符串,但我不知道如何从文件名中删除它。

知道如何在 shell 中做到这一点吗?

4

3 回答 3

5

如果您安装了perl 版本的rename命令,您可以尝试:

rename 's/-[0-9]+//' *.tedx

演示:

[me@home]$ ls
hello-123.tedx  world-23456.tedx
[me@home]$ rename 's/-[0-9]+//' *.tedx
[me@home]$ ls
hello.tedx  world.tedx

如果这意味着覆盖现有文件,则此命令足够聪明,不会重命名文件:

[me@home]$ ls
hello-123.tedx  world-123.tedx  world-23456.tedx
[me@home]$ rename 's/-[0-9]+//' *.tedx
world-23456.tedx not renamed: world.tedx already exists
[me@home]$ ls
hello.tedx  world-23456.tedx  world.tedx
于 2012-12-19T10:51:44.450 回答
3
echo NAME-12345.tedx | sed "s/-[0-9]*//g"

会给NAME.tedx。因此,您可以使用循环并使用mv命令移动文件:

for file in *.tedx; do
   newfile=$(echo "$file" | sed "s/-[0-9]*//g")
   mv "$file" $newfile
done
于 2012-12-19T10:43:39.127 回答
1

如果您只想使用外壳

shopt -s extglob
for f in *-+([0-9]]).tedx; do
    newname=${f%-*}.tedx    # strip off the dash and all following chars
    [[ -f $newname ]] || mv "$f" "$newname"
done
于 2012-12-19T14:10:59.250 回答