使用解压缩,grep和剪切

时间:2015-12-12 13:28:46

标签: bash shell grep unzip cut

我正在查看一些遗留代码,但无法弄清楚它的用途:

for date in 19960822 19960823 19960824 19960825 19960826 \
        19960827 19960828 19960829 19960830 19960831
do
   echo "copying files from date $date..."
   unzip /mnt/cdrom/$date.zip \
  `grep $date $DIR/files.eng | cut -d/ -f2` > /dev/null
done

解压缩命令后反斜杠\做什么?为什么要继续解压缩命令?

此外,剪切使用自定义标记(正斜杠/)并提取第二列,然后重定向到/dev/null?为什么呢?

注意:我在OS X上。

1 个答案:

答案 0 :(得分:1)

反斜杠可以逃避行尾,因此命令可以继续到下一行。您的代码以这种方式解释:

for date in 19960822 19960823 19960824 19960825 19960826 19960827 19960828 19960829 19960830 19960831
do echo "copying files from date $date..."
   unzip /mnt/cdrom/$date.zip `grep $date $DIR/files.eng | cut -d/ -f2` > /dev/null
done
  1. >/dev/null正在从解压缩命令重定向stdout,而不是切换。 unzip -q(安静模式)我相信会做同样的事情。看起来这是一次尝试压制“不匹配”的失败尝试。错误被抛出。使用2>/dev/null
  2. grep $date $DIR/files.eng | cut -d/ -f2是替代命令;不推荐使用返回刻度而使用$( )方法。它目前代表"列表"根据解压缩用法:Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir;
  3. ' /'是剪切的分界符。它的目的是删除文件路径,以便替换命令只返回文件名。更好的方法是使用xargs和basename:grep $date $DIR/files.eng | xargs -n1 basename
  4. 解压缩是不匹配的'错误只是因为压缩文件不包含在files.eng中找到的xml文件名。
  5. 尝试使用:

    unzip /mnt/cdrom/${date}.zip $(grep ${date} ${DIR}/files.eng | xargs -n1 basename) 2>/dev/null
    

    修改

    澄清一下,正如我看到一些关于草率编程的评论;它很草率,但语法方面并不完全错误。它定位了要更新的特定预定文件。不会提取与列表不匹配的.zip文件的其他内容。你的解压缩参数如下:

    $1 zipped_file="/mnt/cdrom/${date}.zip"
    $2 include_list="$(grep ${date} ${DIR}/files.eng | xargs -n1 basename)"
    $3 exclude_list=