使用正则表达式确定bash中的正确扩展名

时间:2013-01-23 17:17:33

标签: regex bash

想知道是否有人可以用正则表达式和bash来帮助我。

我正在尝试对只有特定扩展名的文件执行一组命令,在这种情况下:mpg,mpeg,avi和mkv。

我实际上在这里找到了一个解决方案,然而,它似乎不起作用。如果有人能告诉我原因,我会很感激。

#!/bin/bash

# Configuration
TARGETDIR="$1"
TARGETEXT="(mpg|mpeg|avi|mkv)"

for d in `find $1 -type d`
do
    echo "Searching directory: $d"

    for f in "$d"/*
    do
            if [ -d "${f}" ];
            then
                    # File is a directory, do not perform
                    echo "$f is a directory, not performing ..."
            elif [ -f "${f}" ]; 
            then
                    filename=$(basename "$f")
                    extension="${filename##*.}"
                    if [ "$extension" == "$TARGETEXT" ];
                    then
                            echo "Match"
                    else
                            echo "Mismatch - $f - $extension"
                    fi
            fi
    done
done

再次,感谢任何帮助。

3 个答案:

答案 0 :(得分:6)

这可以仅使用find命令来完成。

find $TARGETDIR -regex ".*\\.$TARGETEXT" -type f -exec your_command {} \;

答案 1 :(得分:1)

而不是直接字符串比较

if [ "$extension" == "$TARGETEXT" ];

使用Bash正则表达式匹配语法

if [[ "$extension" =~ $TARGETEXT ]];

请注意double [[]]和未引用的$ TARGETEXT。

答案 2 :(得分:0)

你可以在没有正则表达式的bash中执行此操作,只需文件模式:

shopt -s globstar nullglob
for f in **/*.{mpg,mpeg,avi,mkv}; do 
    if [[ -f "$f" ]]; then
        # do something with the file:
        echo "$f"
    fi
done