从以下Shell脚本中查找哪个文件存在问题

时间:2012-10-25 01:15:43

标签: linux bash shell unix

问题陈述: - 下面是别人写的剧本,他离开了公司,所以我不知道应该向谁询问这个问题。所以这就是我在这里找到解决方案的原因。

这个脚本的作用是 - 它从特定文件夹(/data/ds/real/EXPORT_v1x0) gzip特定日期(20121017)的数据并将其移回HDFS (hdfs://ares-nn/apps/tech/ds/new/)目录。

date=20121017
groups=(0 '1[0-3]' '1[^0-3]' '[^01]')
  for shard in 0 1 2 3 4 5 6 7 8 9 10 11; do
    for piece in 0 1 2 3; do
        group=${groups[$piece]}
        if ls -l /data/ds/real/EXPORT_v1x0_${date}_${shard}_T_${group}*.dat.gz; then
          gzip -dc /data/ds/real/EXPORT_v1x0_${date}_${shard}_T_${group}*.dat.gz | \
          hadoop jar /export/home/ds/lib/HadoopUtil.jar com.host.hadoop.platform.util.WriteToHDFS -z -u \
          hdfs://ares-nn/apps/tech/ds/new/$date/EXPORT-part-$shard-$piece
          sleep 15
       fi
    done
  done

因此,在迁移到HDFS期间,我发现此文件在HDFS中存在一些问题 -

hdfs://ares-nn/apps/tech/ds/new/20121017/EXPORT-part-8-3

那么有没有办法从上面的脚本做一些排列,我们可以找出这个目录(/data/ds/real/EXPORT_v1x0)下最终被转换为有问题的hdfs://ares-nn/apps/tech/ds/new/20121017/EXPORT-part-8-3的文件。

有什么想法吗?

更新: -

以下是这样的事情?

groups=(0 '1[0-3]' '1[^0-3]' '[^01]')
  for shard in 0 1 2 3 4 5 6 7 8 9 10 11; do
    for piece in 0 1 2 3; do
        group=${groups[$piece]}
        if ls -l /data/ds/real/EXPORT_v1x0_${date}_${shard}_T_${group}*.dat.gz; then
          [ "$date/EXPORT-part-$shard-$piece" == "20121017/EXPORT-part-8-3" ] && {
                echo /data/real/EXPORT_v1x0_${date}_${shard}_T_${group}*.dat.gz
            }
         fi
    done
  done

我在/ data / real / EXPORT文件夹中的示例文件格式很少 -

/data/real/EXPORT_v1x0_20121017_4_T_115600_115800.dat.gz
/data/real/EXPORT_v1x0_20121017_4_T_235600_235800.dat.gz
/data/real/EXPORT_v1x0_20121017_4_T_115800_120000.dat.gz
/data/real/EXPORT_v1x0_20121017_4_T_235800_000000.dat.gz

在进行更改后我得到的样本输出很少 -

/data/real/EXPORT_v1x0_20121017_0_T_0*.dat.gz: No such file or directory
/data/real/EXPORT_v1x0_20121017_0_T_1[0-3]*.dat.gz: No such file or directory
/data/real/EXPORT_v1x0_20121017_0_T_1[^0-3]*.dat.gz: No such file or directory
/data/real/EXPORT_v1x0_20121017_0_T_[^01]*.dat.gz: No such file or directory

1 个答案:

答案 0 :(得分:1)

在这种情况下,将整个gzip行替换为:

[ "$date/EXPORT-part-$shard-$piece" == "20121017/EXPORT-part-8-3" ] && {
    echo /data/real/EXPORT_v1x0_${date}_${shard}_T_${group}*.dat.gz
}

这应该可以解决问题。编辑:删除sleep以加快循环!