LinuxForum.Fans
Тема

Скрипт на копирование файлов с добавлением даты

Автор: sinxron 28 сообщений 10569 просмотров
#267712

Доброе время суток уважаемые форумчане, прошу дать совет или же направить на путь истины.
Суть в том что необходимо написать Скрипт sh который будет копировать файлы с папки в папку с одним но.
Исходныe файлы называются d.1.du w.1.su s.1.rf
лежат в /home/ скопировать нужно в /home/1/
Но скопировать нужно с добавлением даты и сохранением последних строк оригинального файла
Т.e файлы после копирования должны иметь вид

20120803_1.du 20120803_1.su. 20120803_1.rf. Просто добавив в процессе копирования дату и обрезать название в начале.

#267752
text

#!/bin/bash
# Путь к каталогу с файлами
SRC_DIR="${1}"
# Количество скопированных строк.
NUMBER_STRING="2"

mkdir -p "${SRC_DIR}/1"

for i in $(ls "${SRC_DIR}"); do [ -f "${SRC_DIR}/${i}" ] && tail -n ${NUMBER_STRING} "${SRC_DIR}/${i}" > "${SRC_DIR}/1/$(date +%Y%m%d)_${i#*.}" done

P.S. В качестве аргумента скрипту передаётся путь к целевому каталогу, в вашем случае /home.
Скрипт без «изысков», поэтому должен находиться вне вашего каталога /home

#267765

Спасибо, скрипт работает а если нужно не копировать а перемещать файлы т.е не оставлять их в /home/

#267766
sinxron написал:
Спасибо, скрипт работает а если нужно не копировать а перемещать файлы т.е не оставлять их в /home/
text

#!/bin/bash
SRC_DIR="${1}"
NUMBER_STRING="2"
mkdir -p "${SRC_DIR}/1"
 
for i in $(ls "${SRC_DIR}");
    do
        [ -f "${SRC_DIR}/${i}" ] && tail -n ${NUMBER_STRING} "${SRC_DIR}/${i}" >  "${SRC_DIR}/1/$(date +%Y%m%d)_${i#*.}"
         rm -f "${SRC_DIR}/${i}" > /dev/null 2>&1
done

Как-нибудь так, но всё это пишется «на коленке», так что возможны огрехи. ;)

#268044

не пойму в чём проблемма при перемещении файлов размер файлов меняется были от 870кб до 15мб стали намного меньше и почти одинаковые. внутри файлов вместо кучи данных только первые две строчки после выполнения скрипта :(

#268055
"sinxron" написал:
не пойму в чём проблемма при перемещении файлов размер файлов меняется были от 870кб до 15мб стали намного меньше и почти одинаковые. внутри файлов вместо кучи данных только первые две строчки после выполнения скрипта ac
"sinxron" написал:
Но скопировать нужно с добавлением даты и сохранением последних строк оригинального файла

Разумеется, файлы будут меньше. Если нужно обычное переименование, то

text
[ -f "${SRC_DIR}/${i}" ] && tail -n ${NUMBER_STRING} "${SRC_DIR}/${i}" >  "${SRC_DIR}/1/$(date +%Y%m%d)_${i#*.}"
         rm -f "${SRC_DIR}/${i}" > /dev/null 2>&1

надо заменить на

text
[ -f "${SRC_DIR}/${i}" ] && mv "${SRC_DIR}/${i}"  "${SRC_DIR}/1/$(date +%Y%m%d)_${i#*.}"
#268281

Спасибо!Отлично работает, Ещё хотел бы узнать пару вопросов если возможно. У меня исходные файлы лежат теперь не в оной папке а 6-ти разных т.е /home/1/ /home/2/ /home/3/ /home/4/ /home/5/ /home/6/ соответственно перемещаю их в /home/base/ как лучше сделать чтоб не писать постоянно для каждой папки всю процедуру копирования да и возможно ли?
например скрипт зашёл в папку 1 выполнил [ -f "${SRC_DIR}/${i}" ] && mv "${SRC_DIR}/${i}" "${SRC_DIR}/1/$(date +%Y%m%d)_${i#*.}"
потом во 2 папку 3 4 5 6 что бы код не повторять для каждой папки можно ли такое сделать?
Ну и второй вопрос все файлы имеют в первой строке дату можно ли вместо даты $(date +%Y%m%d) подстовлять дату из файла
по принципу

head -1 файл | cut -c 27-34

первая строчка в файле 353763 3647 3900-_370000000012_08_03_39800472. это дата > 12_08_03

#268282
"sinxron" написал:
как лучше сделать чтоб не писать постоянно для каждой папки всю процедуру копирования да и возможно ли?

Возможно. Часть скрипта, отвчечающую за переименование и перемещение, оформить функцией. Далее эту функцию запустить в цикле for i in .... fi для указанной последовательности каталогов.

"sinxron" написал:
Ну и второй вопрос все файлы имеют в первой строке дату можно ли вместо даты $(date +%Y%m%d) подстовлять дату из файла
по принципу

head -1 файл | cut -c 27-34

Можно, но вместо cut лучше использовать sed или awk.

#268301

ЧТо то на подобии этого head -1 file | sed 's/^.\{26\}\([0-9]\{8\}\).*$/\1/'

#268304
"sinxron" написал:
ЧТо то на подобии этого head -1 file | sed 's/^.\{26\}\([0-9]\{8\}\).*$/\1/'

Я подразумевал поиск не по позиции в строке, а по регулярному выражению.
Все первые строки файлов имеют одинаковую структуру?

#268311

да

2787675D 4 5643HTS312-08-0300-00-0000-0012-08-0300-00-000

дата 12-08-03 после символов......HTS3 (но бывает и после HLQ2 это меняется)но дата имеет фиксированную позицию во всех файлах , необходимо брать её и загонять вместо $(date +%Y%m%d)

#268319

Если позиция постоянная, то можно и cut, как вы предлагали сразу.

#268324

а как head -1 файл | cut -c 27-34 подставить вместо $(date +%Y%m%d) ?

#268325
text
$(head -1 файл | cut -c 27-34)

только номера полей точнее подберите, вроде бы должно быть 29-36

#268326
"sinxron" написал:
первая строчка в файле 353763 3647 3900-_370000000012_08_03_39800472. это дата > 12_08_03
"sinxron" написал:
2787675D 4 5643HTS312-08-0300-00-0000-0012-08-0300-00-000

Позиция даты в строках различается.

#268328

все строки такие 2787675D 4 5643HTS312-08-0300-00-0000-0012-08-0300-00-000 в шапке набрал от балды

#268368

Сделал так надеюсь верно [ -f "${SRC_DIR}/${i}" ] && mv "${SRC_DIR}/${i}" "${SRC_DIR}/1/$(head -1 ${SRC_DIR}/${i} | cut -c 19-26)_${i#*.}" работает

12-08-03

#269346

Для упрощения кода сделал так функция берёт файлы с /home/1 /home/2 и так до /home/5 (Переменная $d внутри цикла содержит текущую директорию из перебираемых)и кидает их в папку /home/base/ под именами FILE1 FILE2......FILE5


#!/bin/bash

for d in /home/[1-5];
do
for f in "$d"/*
do
[ -f "$f" ] && mv "$f" "/home/base/FILE$(basename "$d").${f#*.}"
done
done

вырезал дату с первой строчки по позиции но позиции оказались разные соответственно использую sed

sed -n '1{s|^.*\([0-9]\{2\}-[0-9]\{2\}-[0-9]\{2\}\).*$|\1|;p}'

Как подружить эти 2 пункта ??? что бы новый код так же вырезал дату с файлов?

#269949
"sinxron" написал:
Как подружить эти 2 пункта ??? что бы новый код так же вырезал дату с файлов?
text
DATE=$(sed бла-бла-бла)
mv "$f" "$DATE$f"
#269964

Спасибо, но что то не выходит у меня :( после добовления строчки всё остальное не выполняется. Прошу не пинать сильно т.к новичек в этом деле.

DATE=$(sed -n '1{s|^.*\([0-9]\{2\}-[0-9]\{2\}-[0-9]\{2\}\).*$|\1|;p}')

#!/bin/bash

for d in /home/[1-5];
do
for f in "$d"/*
do
[ -f "$f" ] && mv "$f" "/home/base/FILE$(basename "$d").${f#*.}"
done
done

Войдите или зарегистрируйтесь, чтобы ответить.