1

想知道是否有人可以用正则表达式和 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

再次感谢任何帮助。

4

3 回答 3

6

这可能仅使用find命令即可完成。

find $TARGETDIR -regex ".*\\.$TARGETEXT" -type f -exec your_command {} \;
于 2013-01-23T17:33:01.793 回答
1

而不是直接的字符串比较

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

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

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

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

于 2013-01-23T18:24:41.560 回答
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
于 2013-01-23T22:58:35.133 回答