![从文件名中删除数字](https://linux22.com/image/43426/%E4%BB%8E%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E5%88%A0%E9%99%A4%E6%95%B0%E5%AD%97.png)
我在修改目录中的文件名时遇到问题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 -exec
xargs
grep
这是我现在尝试过的:
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]+'" - {}
类似,但我收到“文件名太长”之类的错误或根本没有输出。我想问题是我在单独的命令中使用xargs
or作为表达式的方式工作得很好。find
感谢您的帮助
答案1
要列出目录中以数字开头的所有文件,
find . -maxdepth 1 -regextype "posix-egrep" -regex '.*/[0-9]+.*\.mp3' -type f
您的方法的问题是find
返回文件的相对路径,而您只是期望文件名本身。
答案2
在 Debian、Ubuntu 及其衍生版本上,使用rename
perl 脚本(还有一个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