2

我的手上有点进退两难。一家公司正在将 CSV 电话数据发送到我的服务器(通过 SSH 传输),然后我需要通过 cron 作业将其移动到不同的目录。

目录示例如下:

erd_0010415_10120627_D.csv.Z
erd_0010416_20120616_W.csv.Z
erd_0010416_20120623_W.csv.Z

如您所见,文件名由“erd”后跟其他公司生成的数字(与我们无关,但可以是任何数字)、日期和另一个看似随机的字母组成。

这些文件每天都会发送,但只有在拨打电话时才会发送(因此在某些日子里,前一天的文件可能会丢失)。

我需要设置一个 cron 作业,它将昨天的文件(如果存在)并将其移动到不同的目录。

类似于...的东西

mv erd_*_$(/bin/date +%Y%m%d)_*.csv.Z /home/other-user/calls/$(/bin/date +%Y%m%d).csv.Z

显然,星号实际上并不适用。

4

3 回答 3

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
于 2012-07-03T16:52:34.983 回答
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

In place of the mv command. This part presumes your shell for the cron job is bash and not just sh, in which it would be a little different.

于 2012-07-03T17:19:17.143 回答
0

凭借我非常基本的知识,我知道有时移动文件的方式是通过访问目录本身来获取文件列表。例如:vim 文件/

然后您知道确切的名称,您可以过滤它们并像那样移动它们。

如果这不起作用,那么我会更详细地说明文件是如何发送的,因为听起来它们在一个文件中,你所要做的就是

cp <directory they are in>/* <directory you want> 
于 2012-07-03T16:51:14.847 回答