从复杂的bash命令创建脚本

时间:2010-09-07 11:24:00

标签: linux bash command-line

我需要在包含大量gzip压缩文件的文件夹中运行以下命令。

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

我的问题是该命令不会将gzip压缩文件作为输入。因此,我需要动态解压缩所有这些gzip压缩文件并在这些解压缩的文件上运行此命令。这些gzip压缩文件位于另一个文件夹中,我不允许解压缩它们。我想要一个shell脚本,它将获取远程gzip文件的路径并将其存储在路径下(这也将成为脚本的参数)。解压缩然后运行上面的命令。

注意:“协议”,“开始时间”,“结束时间”,“输出文件名”不一定是现在的参数我只是将它们直接放在脚本中,这样它就不那么复杂。

1 个答案:

答案 0 :(得分:3)

你可以这样做:

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

展开:

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>