用于设计命令的脚本

时间:2013-09-08 11:12:43

标签: bash sed awk

我有一个命令,它给出了特定模式的日期,但我想重新设计它。

$ for i in {21..27}; do    date +%Y%m%d --date="+${i} days ${start}"; done| sed
-e "s/^/*/g"|sed "s/$/*/g"
*20130822*
*20130823*
*20130824*
*20130825*
*20130826*
*20130827*
*20130828*

通过这个方法,它在不同的行中打印日期,我希望输出命令看起来如下所示,将行中的所有日期分隔为空格。

cp -av /cygdrive/w/*20130822 /cygdrive/w/*20130823 /cygdrive/w/*20130824 /cygdrive/w/*20130825 /cygdrive/w/*20130826 /cygdrive/w/*20130827 /cygdrive/w/*20130828 /cygdrive/c/KPI/test/;

请建议。

3 个答案:

答案 0 :(得分:0)

$ start="08/01/2013"
$ for i in {21..27}; do    date +%Y%m%d --date="+${i} days ${start}"; done|
awk 'BEGIN{printf "cp -av"} {printf " /cygdrive/w/*%s",$0} END{print " /cygdrive/c/KPI/test/;"}'
cp -av /cygdrive/w/*20130822 /cygdrive/w/*20130823 /cygdrive/w/*20130824 /cygdrive/w/*20130825 /cygdrive/w/*20130826 /cygdrive/w/*20130827 /cygdrive/w/*20130828 /cygdrive/c/KPI/test/;

如果您只想生成文件列表,请运行cp:

$ start="08/01/2013"
$ cp -av $(for i in {21..27}; do    date +%Y%m%d --date="+${i} days ${start}"; done|
awk '{printf " /cygdrive/w/*%s",$0}') /cygdrive/c/KPI/test/;

答案 1 :(得分:0)

Bash(例如bash script.sh 20130821):

#!/bin/bash

start=$1

patterns=()
for i {0..6}; do
    patterns[${#patterns[@]}]="/cygdrive/w/*$(exec date '+%Y%m%d' --date="+${i} days ${start}")*"
done

cp -av ${patterns[*]} /cygdrive/c/KPI/test/

POSIX(例如sh script.sh 20130821):

#!/bin/sh

start=$1

patterns=''
for i in $(seq 0 6); do
    patterns="$patterns /cygdrive/w/*$(exec date '+%Y%m%d' --date="+${i} days ${start}")*"
done

cp -av $patterns /cygdrive/c/KPI/test/

注意:如果您的意思是/cygdrive/w/*yyyymmdd(最后没有*),请删除模式分配中的最后一个*

您也可以将脚本保存到/usr/local/bin,例如/usr/local/bin/myscript。使用0755将执行权限更改为0700chmod,然后您就可以运行myscript (date)

答案 2 :(得分:0)

这可能适合你(GNU sed):

export start=20130909
seq -s\  -f'/cygdrive/w/*$(date +%%Y%%m%%d -d"+%g days $start")' 21 27 |
sed 's|.*|echo "cp -av & /cygdrive/c/KPI/test"/|e'

这会导出start日期(以便以后通过管道命令访问它)。生成所需的数字序列。然后将序列替换为所需的路径。最后添加cp和最终路径命令,然后将整个字符串传递给echo并进行评估。