2012-07-03 3 views
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 

Очевидно, что звездочки фактически не работают в этом.

+0

Вам действительно нужно переместить и переименовать? см. команду rename, это sed для имен файлов. –

+0

'mv erd _ * _ $ (/ bin/date +% Y% m% d) _ *. Csv.Z/home/other-user/calls /' –

ответ

2

Как насчет just:

mv erd_*_$(date -v -1d +%Y%m%d)_*.csv.Z destination_dir/ 

Если файл не существует, он просто ничего не сделает, иначе он будет работать. Пример:

[email protected] ~/tmp $ touch erd_0010416_20120702_W.csv.Z 
[email protected] ~/tmp $ mkdir 2 
[email protected] ~/tmp $ mv erd_*_$(date -v -1d +%Y%m%d)_*.csv.Z 2/ 
[email protected] ~/tmp $ ls 2 
erd_0010416_20120702_W.csv.Z 
+0

Я думаю, что это может быть путь, однако, когда я попробуйте переместить файл в каталог в другом домашнем каталоге пользователя, я получаю отказ от разрешения. Я установил права целевого каталога на 0777. –

+0

@DanGreaves: может быть, у вас нет разрешения на перемещение самого файла? – houbysoft

0

С моими основными знаниями, я знаю, как иногда я перемещаю файл, я получаю список файлов от доступа к самому каталогу. Например: файл vim/

Тогда вы знаете точные имена, и вы можете просто фильтровать их и перемещать их так.

Если не работает, то я бы уточнить немного больше о том, как файлы будут отправлены, потому что кажется, что они находятся в файле и все, что вам нужно сделать, это

cp <directory they are in>/* <directory you want> 
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, в которой она будет немного отличаться.

Смежные вопросы