我正在尝试使用robocopy复制文件。我要复制的文件应该是上个月(不是一个月),即如果我在3月份(任何一天)运行脚本,那么它应该复制所有带有2月时间戳的文件。我正在使用以下脚本:
robocopy source/*.prev destination maxage:20180201 minage:20180228
如何在这里使用日期作为变量,所以我不必每个月手动更改一次?
答案 0 :(得分:0)
您可以像这样计算的最后日期:date -d "-$(date +%d) days -0 month" +%Y-%m-%d
今天输出:2018-02-28
第一个日期是一个简单的固定开始日期:date -d "-$(date +%d) days -0 month" +%Y-%m-01
今天执行哪一次:2018-02-01
您的命令可能是:
robocopy source/*.prev destination \
maxage:$(date -d "-$(date +%d) days -0 month" +%Y%m01) \
minage:$(date -d "-$(date +%d) days -0 month" +%Y%m%d)
编辑:由于这是使用GNU日期语法,这可能不适用于@ghoti
所述的unix答案 1 :(得分:0)
拥有GNU约会你可以这样做:
start=$(date -d "$(date +%Y-%m-1) -1 month" +%Y%m%d)
end=(date -d "$(date +%Y-%m-1) -1 day" +%Y%m%d)
robocopy source/*.prev destination maxage:${start} minage:${end}
参见linux - Using date
command to get previous, current and next month
看看为什么我们需要-d。在一个月的31个月, -1个月会破坏。
答案 2 :(得分:0)
让我假设POSIX兼容date
可用
那怎么样:
#!/bin/bash
days[1]=31; days[2]=28; days[3]=31; days[4]=30
days[5]=31; days[6]=30; days[7]=31; days[8]=31
days[9]=30; days[10]=31; days[11]=30; days[12]=31
# current year and month
year=$(date +%Y)
month=$(( $(date +%m) + 0 ))
# previous month
if [[ "$month" = "1" ]]; then
year=$(( $year - 1 ))
month="12"
else
month=$(( $month - 1 ))
fi
days=${days[$month]}
# a leap year correction
if [[ "$month" = "2" ]]; then
days=$(( $days + ($year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0)) ))
fi
maxage=$( printf "%04d%02d%02d" $year $month 1 )
minage=$( printf "%04d%02d%02d" $year $month $days )
答案 3 :(得分:0)
@echo off
setlocal enableextensions disabledelayedexpansion
rem Initialize variables to hold the previous month information
set "yyyy="
set "mm="
set "dd="
rem The robocopy in the for command will generate an error with the current date
for /f "tokens=1,2 delims=/" %%a in ('
robocopy "|" . /njh
') do if not defined yyyy (
rem Calculate previous month from current date
set /a "mm=(1%%b-90) %% 12 + 1", "yyyy=%%a - !(mm %% 12)"
rem Calculate the last day of the previous month
set /a "dd=30+((mm+mm/8) %% 2)+(-2+!(yyyy%%4)-!(yyyy%%100)+!(yyyy%%400))*!(%%b-3)"
rem Increase month and day for proper padding
set /a "dd+=100", "mm+=100"
)
rem Leave only the two right digits in month and day
set "mm=%mm:~-2%"
set "dd=%dd:~-2%"
rem Do the copy operation, selecting files from first to last days in previous month
robocopy "x:\source" "y:\target" *.prev /maxage:%yyyy%%mm%01 /minage:%yyyy%%mm%%dd%