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

mvコマンドの代わりに。この部分では、cron ジョブのシェルが であるbashだけshでなく、少し異なることを前提としています。

于 2012-07-03T17:19:17.143 に答える
0

私の非常に基本的な知識では、ファイルを移動する方法は、ディレクトリ自体にアクセスしてファイルのリストを取得することであることを知っています。例: vim ファイル/

次に、正確な名前がわかれば、それらをフィルタリングして、そのように移動できます。

それがうまくいかない場合は、ファイルがファイル内にあるように聞こえるので、ファイルがどのように送信されているかをもう少し明確にします。

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