Доброе время суток уважаемые форумчане, прошу дать совет или же направить на путь истины.
Суть в том что необходимо написать Скрипт sh который будет копировать файлы с папки в папку с одним но.
Исходныe файлы называются d.1.du w.1.su s.1.rf
лежат в /home/ скопировать нужно в /home/1/
Но скопировать нужно с добавлением даты и сохранением последних строк оригинального файла
Т.e файлы после копирования должны иметь вид
20120803_1.du 20120803_1.su. 20120803_1.rf. Просто добавив в процессе копирования дату и обрезать название в начале.
Скрипт на копирование файлов с добавлением даты
#!/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
Спасибо, скрипт работает а если нужно не копировать а перемещать файлы т.е не оставлять их в /home/
Спасибо, скрипт работает а если нужно не копировать а перемещать файлы т.е не оставлять их в /home/
#!/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Как-нибудь так, но всё это пишется «на коленке», так что возможны огрехи. ;)
не пойму в чём проблемма при перемещении файлов размер файлов меняется были от 870кб до 15мб стали намного меньше и почти одинаковые. внутри файлов вместо кучи данных только первые две строчки после выполнения скрипта :(
не пойму в чём проблемма при перемещении файлов размер файлов меняется были от 870кб до 15мб стали намного меньше и почти одинаковые. внутри файлов вместо кучи данных только первые две строчки после выполнения скрипта ac
Но скопировать нужно с добавлением даты и сохранением последних строк оригинального файла
Разумеется, файлы будут меньше. Если нужно обычное переименование, то
[ -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надо заменить на
[ -f "${SRC_DIR}/${i}" ] && mv "${SRC_DIR}/${i}" "${SRC_DIR}/1/$(date +%Y%m%d)_${i#*.}"Спасибо!Отлично работает, Ещё хотел бы узнать пару вопросов если возможно. У меня исходные файлы лежат теперь не в оной папке а 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
как лучше сделать чтоб не писать постоянно для каждой папки всю процедуру копирования да и возможно ли?
Возможно. Часть скрипта, отвчечающую за переименование и перемещение, оформить функцией. Далее эту функцию запустить в цикле for i in .... fi для указанной последовательности каталогов.
Ну и второй вопрос все файлы имеют в первой строке дату можно ли вместо даты $(date +%Y%m%d) подстовлять дату из файла
по принципу
head -1 файл | cut -c 27-34
Можно, но вместо cut лучше использовать sed или awk.
ЧТо то на подобии этого head -1 file | sed 's/^.\{26\}\([0-9]\{8\}\).*$/\1/'
ЧТо то на подобии этого head -1 file | sed 's/^.\{26\}\([0-9]\{8\}\).*$/\1/'
Я подразумевал поиск не по позиции в строке, а по регулярному выражению.
Все первые строки файлов имеют одинаковую структуру?
да
2787675D 4 5643HTS312-08-0300-00-0000-0012-08-0300-00-000
дата 12-08-03 после символов......HTS3 (но бывает и после HLQ2 это меняется)но дата имеет фиксированную позицию во всех файлах , необходимо брать её и загонять вместо $(date +%Y%m%d)
Если позиция постоянная, то можно и cut, как вы предлагали сразу.
а как head -1 файл | cut -c 27-34 подставить вместо $(date +%Y%m%d) ?
$(head -1 файл | cut -c 27-34)только номера полей точнее подберите, вроде бы должно быть 29-36
первая строчка в файле 353763 3647 3900-_370000000012_08_03_39800472. это дата > 12_08_03
2787675D 4 5643HTS312-08-0300-00-0000-0012-08-0300-00-000
Позиция даты в строках различается.
все строки такие 2787675D 4 5643HTS312-08-0300-00-0000-0012-08-0300-00-000 в шапке набрал от балды
Сделал так надеюсь верно [ -f "${SRC_DIR}/${i}" ] && mv "${SRC_DIR}/${i}" "${SRC_DIR}/1/$(head -1 ${SRC_DIR}/${i} | cut -c 19-26)_${i#*.}" работает
12-08-03
Для упрощения кода сделал так функция берёт файлы с /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 пункта ??? что бы новый код так же вырезал дату с файлов?
Как подружить эти 2 пункта ??? что бы новый код так же вырезал дату с файлов?
DATE=$(sed бла-бла-бла)
mv "$f" "$DATE$f"Спасибо, но что то не выходит у меня :( после добовления строчки всё остальное не выполняется. Прошу не пинать сильно т.к новичек в этом деле.
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