ShellScript - IF处理文件名模式

时间:2017-01-26 13:15:25

标签: regex bash shell

我在UNIX中有一个目录,它有数千个.TGZ压缩文件,它们遵循这种模式:

01.red.something.tgz
02.red.something.tgz
03.red.anything.tgz
04.red.something.tgz
01.blue.something.tgz
02.blue.everything.tgz
03.blue.something.tgz
04.blue.something.tgz
01.yellow.something.tgz
02.yellow.blablathing.tgz
03.yellow.something.tgz
04.yellow.something.tgz

他们在文件系统中使用了大量资金,我需要列出它们而不提取文件本身。实际上它需要一些时间,所以我相信这个shellcript符合需要。我是Shellscript的新手,我正在学习,所以我做了这个.sh

$pattern = "red"

for file in *.tgz
do

    if [[ ${file} == '...${pattern}.*.tgz' ]]; then
        echo" ==>  ${file} match the pattern and the output dir is : out/"
        tar -tf $file > ./out/$file
    else
        echo "${file} Doesn't match the pattern"
    fi
done

但是我在 if 部分出了问题,即使模式匹配,我也得到了' 不会'匹配模式'消息。

我知道它有点简单如果,但我无法理解为什么这个家伙不起作用。如果你们能解释为什么这样做不起作用,我会感激不尽。

谢谢。

1 个答案:

答案 0 :(得分:1)

你需要在bash中创建varibales时注意空格,在if中不应该' - 单引号或" - 如果你想匹配,则需要双引号regex,使用:if [[ ${file} == ${regEx} ]];

测试:

$ ls *.tgz
01.red.something.tgz  01.yellow.something.tgz
$ ./t.sh
 ==>  01.red.something.tgz match the pattern and the output dir is : out/
01.yellow.something.tgz Doesn't match the pattern
$ cat t.sh
#!/bin/bash

pattern="red"
regEx="*.${pattern}.*.tgz"

for file in *.tgz
do
    if [[ ${file} == ${regEx} ]]; then
        echo " ==>  ${file} match the pattern and the output dir is : out/"
        #tar -tf $file > ./out/$file
    else
        echo "${file} Doesn't match the pattern"
    fi
done