Создание скрипта из сложной команды bash - PullRequest
0 голосов
/ 07 сентября 2010

Мне нужно выполнить следующую команду в папке, содержащей много сжатых файлов.

perl myscript.pl -d <path> -f <protocol> "<startdate time>"
 "<enddate time>" -o "0:00 23:59" -v -g -b <outputfilename>

Моя проблема в том, что команда не принимает сжатые файлы в качестве входных данных.Итак, мне нужно будет разархивировать все эти сжатые файлы на лету и выполнить эту команду для этих разархивированных файлов.Эти сжатые файлы находятся в другой папке, где я не могу их разархивировать.Я хочу сценарий оболочки, который возьмет путь к удаленным сжатым файлам и сохранит его под путем (который также будет аргументом для сценария).Сделайте расстегивание молнии и затем выполните вышеупомянутую команду.

Примечание: «протокол», «время начала даты», «время окончания», «имя выходного файла» не должны быть аргументами, пока я просто помещу их непосредственно в скрипт, чтобы он был менее сложным.

1 Ответ

3 голосов
/ 07 сентября 2010

Вы можете сделать:

for fname in path/to/*.gz; do gunzip -c "$fname" | perl myscript.pl ; done

Expanded:

for fname in path/to/*.gz; do
  gunzip -c "$fname" | perl myscript.pl
done

И чтобы он принимал имена файлов с пробелами:

old_IFS=$IFS
IFS=$'\n'
for fname in path/to/*.gz; do
  gunzip -c "$fname" | perl myscript.pl -f <protocol> "<startdate time>" \
     "<enddate time>" -o "0:00 23:59" -v -g -b <outputfilename>
done
IFS=$old_IFS

Таким образом, вы заставляете скрипт читать стандартный ввод, который будет содержать содержимое файла, без использования временных файлов.


РЕДАКТИРОВАТЬ: Вот сценарий оболочки, который решает проблему, как первоначально предложено в вопросе:

`myscriptwrapper`:
#!/bin/bash
gzip_path="$1"
temp_path="$2"
#loop thru files from gzip_pah\th
for fname in $gzip_path/*.gz; do
  basename=`basename $fname`
  #fill them in the target dir
  gunzip "$fname" -c > "$temp_path/$basename"
done

#finally, call our script
perl myscript.pl -d "$temp_path" -f <protocol> "<startdate time>" "<enddate time>" -o "0:00 23:59" -v -g -b <outputfilename>

РЕДАКТИРОВАТЬ 2 : Использование tar.gz файлов:

`myscriptwrapper`:
#!/bin/bash
gzip_path="$1"
temp_path="$2"
cd "$temp_path"
#loop thru files from gzip_pah\th
for fname in $gzip_path/*.tar.gz; do
    tar -xzf $fname
done

#finally, call our script
perl myscript.pl -d "$temp_path" -f <protocol> "<startdate time>" "<enddate time>" -o "0:00 23:59" -v -g -b <outputfilename>
...