我有一个命令,它给出了特定模式的日期,但我想重新设计它。
$ 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/;
请建议。
答案 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
将执行权限更改为0700
或chmod
,然后您就可以运行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并进行评估。