【问题标题】:Copying files from folders in one directory to a common folder将文件从一个目录中的文件夹复制到公共文件夹
【发布时间】:2016-06-06 07:34:29
【问题描述】:

我正在编写一个脚本来将文件从一个目录下的文件夹复制到一个公共位置。为此,我需要遍历目录中的文件夹。这些文件夹是按日期排列的,所以我使用的是小于和大于。但我无法进入循环。你能告诉我我的代码有什么问题吗?

#!/usr/bin/ksh

SCRIPT_DIRECTORY='/abc/script'
DATA_DIRECTORY='/a/inbox'
TARGET_DIRECTORY='/abc/final'
START_DATE=$2
END_DATE=$3

if [ $1 == 'a' ]
then
   while [[ $2 -gt 20151201 ]] && [[ $3 -lt 20151231 ]]
   do
     for file in `ls $DATA_DIRECTORY`
     do
        cp name* $TARGET_DIRECTORY
     done
  done
fi

这里 a/inbox 目录下的文件夹是按日期从 20151201 到 20151231 生成的。所以我需要将从名称开始的所有文件提取到一个公共目标目录 我也试图将它作为一个脚本,如果我传递 a,b,c 之类的参数,它将转到相应的数据目录并从那里获取文件

【问题讨论】:

    标签: shell unix sh ksh


    【解决方案1】:

    您的while 声明是错误的。像这样写:

    while (($2 > 20151201 && $3 < 20151231))
    

    还请确认 $1、$2 和 $3 确实包含您期望的值。

    【讨论】:

    • 这会导致第 13 行语法错误:((: > 20151201 && 20151201 &&
    • 要么忘记输入参数,要么参数为空。您可以使用while (( ${2:?two} &gt; 20151201 &amp;&amp; ${3:?three} &lt; 20151231)) 进行验证。
    【解决方案2】:

    试试这个(我试过了,效果很好)

    if [ $1 == 'a' ] then # use ls $DATA_DIRECTORY as mentioned by you; i could not bring it here for file inls $DATA_DIRECTORY do if [ $file -ge 20151201 -a $file -le 20151231 ]; then cp $DATA_DIRECTORY/$file/* $TARGET_DIRECTORY fi done fi

    您只需要一个循环进行迭代,并将日期检查(如果条件)移到循环内。我使用了-ge 而不是-gt,因为它看起来像是某种月度数据。也许您可以根据自己的需要进行调整。希望对您有所帮助。

    【讨论】:

    • 知道如何增加循环中的日期。日期格式应为 yyyymmdd
    • 我不清楚这个问题。我可以知道用例吗
    • 我有一个格式为 20151201 的日期,如何将日期增加到 20151202
    • "count=expr $count + 1" 其中 count 是一个变量。在expr 之前和1 之后放置正斜杠。早期的解决方案对您有用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2023-03-11
    相关资源
    最近更新 更多