从文件名中提取数字

时间:2014-05-02 18:16:36

标签: linux bash shell

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

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

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

123
456
789

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

5 个答案:

答案 0 :(得分:4)

您可以使用parameter substitution

$ 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而不是检查文件是否存在。 (感谢Adrian Frühwirth提供了很好的反馈)

答案 1 :(得分:2)

使用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

答案 2 :(得分:2)

假设您只想保留所有数字而且您正在使用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使用

newname=$(name#photo-}

手册页Parameter Expansion部分介绍了这些和其他几个。

答案 3 :(得分:0)

或者可能有两个连续的awk调用:

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

答案 4 :(得分:-1)

怎么样

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

在文件所在的目录中?