-2

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

$ 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/;

请建议。

4

3 回答 3

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 并进行评估。

于 2013-09-09T06:32:18.353 回答
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/;
于 2013-09-08T11:24:01.117 回答
0

重击(例如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. 将执行权限更改为07550700使用,chmod然后您就可以运行了myscript (date)

于 2013-09-08T11:26:04.457 回答