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 regex マッチング構文を使用する

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 に答える