2016-01-13 6 views
0

У меня есть каталог со всеми tgz файлами. В настоящее время, у меня есть сценарий, который я бегу, что будетОБНОВЛЕНО: скрипт Bash для извлечения всего .tgz в каталоге

  1. взять в каталоге в качестве первого параметра
  2. извлечь tgz
  3. cd в извлеченной папке
  4. , а затем запустить мой нагрузки сценарий
  5. и перейдите к следующему tgz ..

Показаны ниже.

В настоящее время этот скрипт работает, но это не сработает, если кто-то ставит в качестве параметра другой, чем просто имя каталога (например, ./myScript/всего/путь/к/директории)

dirname=$1 
cur_dir=`pwd` 

echo The directory you are about to extract is $dirname 

echo $(ls ${cur_dir}/${dirname}/*.tgz) 

echo Your current directory is ${cur_dir} 

for tgz in $(ls ${cur_dir}/${dirname}/*.tgz) ; do # <---- I think there is a better way of doing this please advise 
     echo the tgz you are about to extract now is ${tgz} 
     cd ${dirname};    #cd into input directory 
     tar -xvzf ${tgz};   #extract tgz 
     cd ${tgz%%.tgz};   #cd into the folder you extracted 
     loadItExit;    #run my other script to load 
     cd ../..;     #move up two levels back to original path 

done 
+0

' for fname in $ {Имя_файла%/*}/* TGZ. do' будет зацикливаться на всех '* .tgz' в каталоге первого заданного файла. – Kellerspeicher

ответ

1

что-то, что выглядит как это может работать

dirname="$1" 
for tgz in $(ls ${dirname}/*.tgz) ; do 
    echo "tar -xzf ${tgz}"; 
    echo "cd ${tgz%%.tgz}"; 
    echo "LoadIt"; 
    echo "cd .."; 
done 

, очевидно, отголоски только для демонстрации

Комментарий избежать использования ls справедливо, если вы не в Contro л вашей среды. Нажимайте фильтр для интересующих файлов дальше в цикл по менее конкретной коллекции.

В зависимости от того, насколько мало у вас контроля, вам могут потребоваться дополнительные параноидальные тесты.

dirname="$1" 
for tgz in ${dirname}/* ; do 
    if [ "${tgz##*\.}" == "tgz" ] then 
     echo "tar -xzf ${tgz}"; 
     echo "cd ${tgz%%.tgz}"; 
     echo "LoadIt"; 
     echo "cd .."; 
    fi 
done 

EDIT для комментария, чтобы объяснить if заявление

первый полукокс [ в Баш это та же команда, как test вы хотите, чтобы держать пространства после [ и перед ]

внутри [ ... ] является выражением (предикат) , которое оценивается как true или false

В этом случае мы используем подстановки переменной
где значение переменной оболочки, $tgz здесь,
модифицируется перед ним используются

Это всегда безопаснее заключите имя из переменная после $ в фигурных скобках { ...}

Однако делать это также позволяет аннотировать переменный вызов
заменить обычное переменное значение с измененным значением

моего быстрым и грязный мнемоником для запоминания аннотаций
и их функции будет смотреть либо сторона $ ключевых
(раскладок извините, не английский, не Qwerty клавиатура)
и обратите внимание на # хэш или фунт символ переходит $
так ${name#<regexp>} будет удалить в первый матч
регулярного выражения <regexp>
после # и до }
из начиная значения переменных.

Аналогично % ключ после $ и ${name%<regexp>}
будет удалитьпоследний матч регулярного выражения
от значения переменной

Обе аннотации могут быть удвоены ## или %% к в среднем:
удалить самый длинный совпадение регулярного выражения
вместо кратчайшего.

так
"${tgz##*\.}" == "tgz"
средства удалить все, вплоть до последней точки
от значения в переменной $tgz и посмотреть, если что остается
в точности равна строке "tgz"

поиск в Интернете по «переменная замещения« bash »
и« тест bash » перенесут вас дальше

+0

[Не разбирайте вывод из 'ls'] (http://mywiki.wooledge.org/ParsingLs) –

+0

Что делать, если я хочу передать весь каталог? что-то вроде этого ./my_script/path/to/my/directory – kkmoslehpour

+0

@tomc вы можете прокомментировать некоторые комментарии рядом с вашим кодом, чтобы объяснить оператор if. – kkmoslehpour

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