2013-01-23 55 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