2013-01-23 56 views
1

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

再次,任何幫助表示讚賞。

回答

1

而不是直接字符串比較

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

使用bash正則表達式匹配語法

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

注意雙[[]]和非引用$ TARGETEXT。

+0

啊,哈!這工作出色。我早些時候嘗試過,但在'$ TARGETEXT'上使用了引號。不知道刪除它會起作用。謝謝一堆。 – Battleroid

6

這可能只能使用find命令完成。

find $TARGETDIR -regex ".*\\.$TARGETEXT" -type f -exec your_command {} \; 
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