我手上有点困境。一家公司正在向我的服务器发送CSV电话呼叫数据(通过SSH传输),然后我需要通过cron作业将其移动到另一个目录。
目录的示例如下:
erd_0010415_10120627_D.csv.Z
erd_0010416_20120616_W.csv.Z
erd_0010416_20120623_W.csv.Z
正如您所看到的,文件名由“erd”组成,后跟另一家公司生成的数字(与我们无关,但可以是任何内容),后跟日期,然后是另一个看似随机的字母。< / p>
这些文件每天都会发送,但只有在拨打电话时才会发送(所以有些日子可能会丢失前一天的文件)。
我需要设置一个cron作业,该作业将获取昨天的文件(如果存在)并将其移动到另一个目录。
有些事情......
mv erd_*_$(/bin/date +%Y%m%d)_*.csv.Z /home/other-user/calls/$(/bin/date +%Y%m%d).csv.Z
显然,星号实际上并不适用于此。
答案 0 :(得分:2)
如何:
mv erd_*_$(date -v -1d +%Y%m%d)_*.csv.Z destination_dir/
如果文件不存在,它就不会做任何事情,否则它会起作用。例如:
jan@MacBook-Pro ~/tmp $ touch erd_0010416_20120702_W.csv.Z
jan@MacBook-Pro ~/tmp $ mkdir 2
jan@MacBook-Pro ~/tmp $ mv erd_*_$(date -v -1d +%Y%m%d)_*.csv.Z 2/
jan@MacBook-Pro ~/tmp $ ls 2
erd_0010416_20120702_W.csv.Z
答案 1 :(得分:1)
使用GNU date
?没什么比这更简单了:
yesterday=$(/bin/date -d yesterday +%Y%m%d)
base=/home/other-user/calls/
source=. # whatever dir the files start in
/bin/mkdir -p "$base/$yesterday"
/bin/mv "$source"/erd_*_"${yesterday}"_[DW].csv.Z "$base/$yesterday"
如果没有任何东西,它将不会移动任何东西,你只会获得该日期的空目录。
如果在移动文件时需要重命名文件,请剥离非日期部分,然后使用
for file in "$source"/erd_*_"${yesterday}"_[DW].csv.Z ; do
file="${file#erd_*_*}"
/bin/mv "$file" "$base/$yesterday/${file%_[DW].csv.Z}.csv.Z"
done
代替mv
命令。这部分假设你的cron作业的shell是bash
,而不仅仅是sh
,其中它会有所不同。
答案 2 :(得分:0)
凭借我的基本知识,我知道我移动文件的方式有时是我会从访问目录本身获得一个文件列表。例如:vim file /
然后你知道确切的名字,你可以过滤它们并像这样移动它们。
如果这不起作用,那么我会详细说明如何发送文件,因为它听起来像是在文件中而你所要做的就是
cp <directory they are in>/* <directory you want>