2017-01-26 2 views
0

У меня есть каталог в UNIX, которая имеет тысячи .tgz сжатых файлов, они следуют этому шаблону:ShellScript - IF обработки имен файлов шаблона

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 

Они используют большое количество из файловой системы, и мне нужно перечислить их без извлечения самого файла. На самом деле это займет некоторое время, поэтому я считаю, что этот shellscript будет соответствовать потребностям. Я своего рода новым для 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 

Но я сделал что-то неправильно в если части, и даже тогда, когда образец сопоставляется, я имею получил 'Не соответствует шаблону' сообщение.

Я знаю, что это просто , если, но я не могу понять, почему этот парень не работает. Я был бы признателен, если вы, ребята, объясните, почему это не работает.

спасибо.

+0

'==' не оператор матча; прочитайте «globbing» и используйте '*. $ {pattern}. *. tgz' непосредственно в for-loop –

+0

Спасибо, я сделаю поиск по этому поводу – Imkls

ответ

1

вам нужно следить за пробелов при создании varibales в Баш, в if не должно быть ' - одиночные кавычки или " - двойные кавычки, если вы хотите, чтобы соответствовать на regex,
использование: if [[ ${file} == ${regEx} ]];

Test :

$ 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 
+0

Спасибо, друг, он работает как шарм. Я понял концепцию, и я буду знать в следующий раз. :) – Imkls

+0

great - считайте это ответом и голосом:) [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) –

Смежные вопросы