从文件名中删除数字

从文件名中删除数字

我在修改目录中的文件名时遇到问题Music/

我有一个这样的名字列表:

$ ls
01 American Idiot.mp3
01 Articolo 31 - Domani Smetto.mp3
01 Bohemian rapsody.mp3
01 Eye of the Tiger.mp3
04 Halo.mp3
04 Indietro.mp3
04 You Can't Hurry Love.mp3
05 Beautiful girls.mp3
16 Apologize.mp3
16 Christmas Is All Around.mp3
Adam's song.mp3
A far l'amore comincia tu.mp3
All By My Self.MP3
Always.mp3
Angel.mp3

类似地,我想删除文件名前面的所有数字(而不是扩展名中的 3)。

我首先尝试仅使用带有或grep编号的文件,但即使在第一步我也没有成功。在能够之后,我想进行实际的名称更改。find -execxargsgrep

这是我现在尝试过的:

ls > try-expression
grep -E '^[0-9]+' try-expression

通过上述我得到了正确的结果。然后我尝试了下一步:

ls | xargs -0 grep -E '^[0-9]+'
ls | xargs -d '\n' grep -E '^[0-9]+'
find . -name '[0-9]+' -exec grep -E '^[0-9]+' {} \;
ls | parallel bash -c "grep -E '^[0-9]+'" - {}

类似,但我收到“文件名太长”之类的错误或根本没有输出。我想问题是我在单独的命令中使用xargsor作为表达式的方式工作得很好。find

感谢您的帮助

答案1

要列出目录中以数字开头的所有文件,

find . -maxdepth 1 -regextype "posix-egrep" -regex '.*/[0-9]+.*\.mp3' -type f

您的方法的问题是find返回文件的相对路径,而您只是期望文件名本身。

答案2

在 Debian、Ubuntu 及其衍生版本上,使用renameperl 脚本(还有一个rename不是 perl 脚本 - 这不起作用)。

模拟重命名操作:

rename 's/^\d+ //' * -n

删除-n(无行为)执行操作:

rename 's/^\d+ //' *

幸运的是,perl rename 也安装/usr/bin/rename在您的发行版上(有传言 Fedora 也使用 perl rename)。

请参阅Perl 重命名手册页有关其他功能的更多详细信息。

答案3

您可以仅使用bash, 以及 a 中的正则表达式来完成以下操作有条件的:

#! /bin/bash

# get all files that start with a number
for file in [0-9]* ; do
    # only process start start with a number
    # followed by one or more space characters
    if [[ $file =~ ^[0-9]+[[:blank:]]+(.+) ]] ; then
        # display original file name
        echo "< $file"
        # grab the rest of the filename from
        # the regex capture group
        newname="${BASH_REMATCH[1]}"
        echo "> $newname"
        # uncomment to move
        # mv "$file" "$newname"
    fi
done

当对示例文件名运行时,输出为:

< 01 American Idiot.mp3
> American Idiot.mp3
< 01 Articolo 31 - Domani Smetto.mp3
> Articolo 31 - Domani Smetto.mp3
< 01 Bohemian rapsody.mp3
> Bohemian rapsody.mp3
< 01 Eye of the Tiger.mp3
> Eye of the Tiger.mp3
< 04 Halo.mp3
> Halo.mp3
< 04 Indietro.mp3
> Indietro.mp3
< 04 You Can't Hurry Love.mp3
> You Can't Hurry Love.mp3
< 05 Beautiful girls.mp3
> Beautiful girls.mp3
< 16 Apologize.mp3
> Apologize.mp3
< 16 Christmas Is All Around.mp3
> Christmas Is All Around.mp3

答案4

我刚刚在对象 Rexx 中编写了几行,删除了文件开头的数字。我的文件是这样的:

数据:

003. Atomic Rooster.mp3
087. Crowded House.mp3

代码:

#!/bin/rexx
'rxqueue /clear'
'ls | rxqueue'
do while queued()>0
 parse pull fn
 parse var fn .'.'rest
 rest = strip(rest)
 if pos('.',rest)=0 then iterate
 "mv '"fn"' '"rest"'"
end

相关内容