从文件名中提取数字

我有一堆文件,都有一个名称和一个序列号和一个扩展名。 我想提取这个序列号和扩展名。 他们看起来像这样:

photo-123.jpg photo-456.png photo-789.bmp 

等等

我想运行一个bash脚本来提取这些序列号,并以这种方式将它们放在一个文件中:

 123 456 789 

等等

请注意,并非所有的照片都有相同的扩展名( bmppngjpg ),但都是以photo-开头的。

您可以使用参数替换 :

 $ ls photo-123.jpg photo-456.png photo-7832525239.bmp photo-789.bmp $ for file in *; do [[ -f "$file" ]] || continue [[ $file == "num.log" ]] && continue file=${file%.*} && echo "${file#*-}" done > num.log $ ls num.log photo-123.jpg photo-456.png photo-7832525239.bmp photo-789.bmp $ cat num.log 123 456 7832525239 789 

${parameter#word}开始处移除最短的匹配, ${parameter##word}开始处移除最长的匹配。 相反, ${parameter%%word}会从最后删除最短匹配, ${parameter%%word}会从最后删除最长匹配。

或者,您可以阅读有关nullglob而不是在目录中没有文件的情况下检查是否存在文件。 (感谢AdrianFrühwirth提供了很好的反馈)

使用BASH正则表达式:

 f='photo-123.jpg' [[ "$f" =~ -([0-9]+)\. ]] && echo "${BASH_REMATCH[1]}" 123 

运行它对所有匹配的文件:

 for f in *-[0-9]*.*; do [[ "$f" =~ -([0-9]+)\. ]] && echo "${BASH_REMATCH[1]}" done 

假设你只是想保留所有的数字,而你正在使用bash,这里有一些你可能会觉得有用的东西:

 danny@machine:~$ file=abc123def.jpg danny@machine:~$ echo ${file//[^0123456789]/} 123 danny@machine:~$ echo ${file##*.} jpg danny@machine:~$ echo ${file//[^0123456789]/}.${file##*.} 123.jpg 

你应该能够写出你的脚本。 或者,只需从$ name中删除前面的“photo-”即可

 newname=$(name#photo-} 

这些和其他几个在bash手册页的参数扩展部分中进行了解释。

或者可能连续两次awk调用:

 ls -1 | awk -F- '{print $2}' | awk -F. '{print $1}' 

怎么样

 ls -l | awk {'print $9'} | grep -o -E '[0-9]*' 

在文件所在的目录中?