如何在UNIX中搜索一百个文件中的少数文件,如果没有,则用0字节文件替换

时间:2013-06-21 09:20:35

标签: unix

我需要一个shell脚本来搜索和替换文件。详情如下。 Pl帮助

  1. 基本上每天我都会把一些文件放到我的目录中。就像下面我得到100个文件
  2. AllResponses_11003_6_20_2013.txt

    AllResponses_11004_6_20_2013.txt

    AllResponses_11005_6_20_2013.txt

    AllResponses_11006_6_20_2013.txt

    AllResponses_11007_6_20_2013.txt

    AllResponses_11008_6_20_2013.txt

    AllResponses_11009_6_20_2013.txt

    AllResponses_11010_6_20_2013.txt

    AllResponses_11011_6_20_2013.txt

    AllResponses_11012_6_20_2013.txt

    1. 其中我需要根据文件编号(11003,11004,11005,11006,11007)将5个文件复制到另一个目录
    2. AllResponses_11003_6_20_2013.txt

      AllResponses_11004_6_20_2013.txt

      AllResponses_11005_6_20_2013.txt

      AllResponses_11006_6_20_2013.txt

      AllResponses_11007_6_20_2013.txt

      1. 如果没有找到,则需要将这5个文件的0字节文件替换到另一个目录中。
      2. Pl帮助

        但是如何在11003到11100之间的数百个数字中传递数字为11003,11004,11005,11006,11007

        帮助......

        export SRCDIR = / informat / PowerCenter / 9.1.0 / server / infa_shared / SrcFiles / CSI / historical

        export TGTDIR = / informat / PowerCenter / 9.1.0 / server / infa_shared / SrcFiles / CSI / incoming

        导出FILEDT = 6_15_2013

        export FILEDT = $(date +“% - m _% - d_%Y”)

        循环搜索和复制文件

        表示“$ @”中的FILE_NUM;

        GET_FNAME =“AllResponses _”$ {FILE_NUM}“_”$ {FILEDT}“* .txt”

        if [-f $ {GET_FNAME}];那么

        cp $ {SRCDIR} / $ {GET_FNAME} $ {TGTDIR}

        其他

        echo $ {SRCDIR}中缺少文件$ {GET_FNAME}

        触摸$ {TGTDIR} / AllResponses _ $ {FILE_NUM} _ $ {FILEDT} .txt

        回显“在$ {TGTDIR}中创建了$ {GET_FNAME}触摸文件”

        完成了

        如上所述完成并执行为ksh -x csi_file_copy_bala.ksh 11003 11004 99999

        但它总是要去其他条款..请帮助我...

        我的文件nales看起来像...... AllResponses_11004_6_11_20132_18_00AM1.txt

        Pl帮我...因为我的时间不多了

        提前致谢

1 个答案:

答案 0 :(得分:1)

假设你的意思是bash:

开头的骷髅:

luk32:~/projects/tests$ cat ./process_files.sh
#!/bin/bash
DEST=./copies
for num in "$@"; do
 file="AllResponses_"$num"_6_20_2013.txt"
 if [ -f $file ]; then
  cp $file $DEST
 else
  touch $DEST/$file
 fi
done;

它将数字作为参数,然后尝试在当前工作目录中查找具有给定模式的文件。如果找到复制到目标文件夹,则为touch文件。 你可能需要修改一下才能比硬编码的日期处理更友好。

示例:

luk32:~/projects/tests$ ls -l
total 40116
-rw-r--r-- 1 luk32 luk32        4 cze 21 11:33 AllResponses_1_6_20_2013.txt
-rw-r--r-- 1 luk32 luk32        5 cze 21 11:33 AllResponses_3_6_20_2013.txt
-rw-r--r-- 1 luk32 luk32        0 cze 21 11:32 AllResponses_4_6_20_2013.txt
luk32:~/projects/tests$ ls -l ./copies/
total 0
luk32:~/projects/tests$ ./process_files.sh 1 2 3 4
luk32:~/projects/tests$ ls -l ./copies/
total 8
-rw-r--r-- 1 luk32 luk32 4 cze 21 11:35 AllResponses_1_6_20_2013.txt
-rw-r--r-- 1 luk32 luk32 0 cze 21 11:35 AllResponses_2_6_20_2013.txt
-rw-r--r-- 1 luk32 luk32 5 cze 21 11:35 AllResponses_3_6_20_2013.txt
-rw-r--r-- 1 luk32 luk32 0 cze 21 11:35 AllResponses_4_6_20_2013.txt