LINUX.ORG.RU

Script для поиска и копирования файла по фтп.

 , ,


1

1

Есть текстовый документ в котором хранятся данные(название файлов, размер, дата). Нужно что бы скрипт брал имена файлов(первый столбец), находил их на машине(показывая путь к ним) и копировал по фтп. Так же бывают файлы с доп припиской «_123», которую нужно убрать при создании копии.



Последнее исправление: SysError (всего исправлений: 1)

Ответ на: комментарий от crutch_master

Все выходит, но вот момент с копированием с другой директории не особо. Переменную вторую надо найденному пути через файнд, которая потом будет указывать где брать для копирования файлы с документа.

SysError
() автор топика
Ответ на: комментарий от crutch_master

выхлоп cat передать cut то делаешь вот так: cat file.csv | cut -f 1

Зачем учить плохому? Зачем тут вообще cat?

Что касается парсенья cvs, то вот мой:

#!/usr/bin/env bash

echo "<table>"
while read l; do
        echo " <tr>"
        while true; do
                if [[ ${l:0:1} == \" ]]; then
                        out=
                        for((i=1;;i++)); do
                                c=${l:i:1}
                                [[ -z $c ]] && break
                                if [[ $c == \" ]]; then
                                        ((i++))
                                        c=${l:i:1}
                                        [[ $c == , || -z $c ]] && break
                                fi
                                out+=$c
                        done
                        echo "  <td>$out</td>"
                        [[ -z $c ]] && break
                        l=${l:i+1}
                else
                        out=${l%%,*}
                        echo "  <td>$out</td>"
                        [[ $l == "$out" ]] && break
                        l=${l#"$out,"}
                fi
        done
        echo " </tr>"
done < "$1"
echo "</table>"
Для вывода первого поля и без html таблички можно чуть упростить:
#!/usr/bin/env bash

while read l; do
                if [[ ${l:0:1} == \" ]]; then
                        out=
                        for((i=1;;i++)); do
                                c=${l:i:1}
                                [[ -z $c ]] && break
                                if [[ $c == \" ]]; then
                                        ((i++))
                                        c=${l:i:1}
                                        [[ $c == , || -z $c ]] && break
                                fi
                                out+=$c
                        done
                else
                        out=${l%%,*}
                fi
                echo "$out"
done < "$1"

vodz ★★★★★
()
Ответ на: комментарий от vodz

Зачем учить плохому? Зачем тут вообще cat?

Это приманка на готовый скрипт. Мухахахахаххаа.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от vodz
#!/bin/bash

cat 1.csv | cut -f 1 | while read f; do echo $f; find / -name $f; fname="$(find / -name $f)"; done;
cd $fname
cp $f /var/www/backup/

Вот что то такое у меня получилось. Но обратно же файл который находиться в другой директории не копируеться. И последние 2 команды думаю можно переделать.

SysError
() автор топика
Ответ на: комментарий от crutch_master

Вопрос с копированием файла который был найден в другом директории остаеться. Да и имя он будет изменять?

SysError
() автор топика
Ответ на: комментарий от SysError

Так ты не правильно сделать. У тебя cd и cp за скриптом. done надо в конец скрипта, cd не надо вообще cp и так скопирует. В одну строчку писать не обязательно.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Сделал по другому.

#!/bin/bash

cat 1.csv | cut -f 1 | while read f; do echo $f; find / -name $f; fname="$(find / -name $f)";
cp $fname /var/www/backup/; done;
sudo ./test.sh
2.csv
/var/www/2.csv
3.csv
/var/www/3.csv
4.csv
/var/www/4.csv
5.csv
/var/www/html/5.csv

Как то так получилось. Вопрос, а как указать что бы файл читался с 2 строки но 1 столбца?

SysError
() автор топика
Ответ на: комментарий от SysError

Вот что то такое у меня получилось.

К сожалению, я вам не могу помочь. Ваш заглавный пост — нечитаемый бред, ваш скрипт больше похож на схематичную картинку с попыткой отобразить, что вам собственно надо, но совсем не похож на рабочий скрипт.

vodz ★★★★★
()
Ответ на: комментарий от crutch_master

И по именам, вот если такая будет ситуация что имя в документе указано как «test» а найден будет «test_123», или не сможет найти потому что имя не совпадает. Это можно как то указать в скрипте? Переименование или поправку такую.

SysError
() автор топика
Ответ на: комментарий от crutch_master

Зачем учить плохому?

Но что плохого в cat file | while read? Чем оно хуже done < file?

Что за шулерство? Было спрошено: зачем cat для | cut, ибо последний прекрасно сам читает файлы. Это было во-первых. А во-вторых, зачем cut перед read? Вам и так и этак надо выделить поле, ну так надо выставить разделитель (который вы в cut не задали) и получите искомое: «IFS=, read field1 other» замечательно сработает и без cut.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Можете тогда показать целосный вид скрипта где учитывались моменты с именем что я вот выше отписал и нормально читался документ с именами и дальнейшим копированием по фтп.

SysError
() автор топика
Ответ на: комментарий от SysError

Вопрос, а как указать что бы файл читался с 2 строки но 1 столбца?

Погугли про head/tail

И по именам, вот если такая будет ситуация что имя в документе указано как «test» а найден будет «test_123», или не сможет найти потому что имя не совпадает. Это можно как то указать в скрипте? Переименование или поправку такую.

cp $fname_из_find /var/www/backup/$f ? Я не знаю на самом деле, вроде так. Проверь как будет работать.

crutch_master ★★★★★
()
Ответ на: комментарий от SysError

Можете тогда показать целосный вид скрипта

Мне делать больше нечего что ли?

где учитывались моменты с именем

Игнорирование первой строки делается её чтением и не запуском парсера для нее.

{
read other
while IFS=, read field1 other; do
  echo "$field1"
done
} < "file.csv"
Это сработает для простого csv без двойных кавычек для полей с запятой внутри. Полный парсер я дал выше.

vodz ★★★★★
()
Ответ на: комментарий от crutch_master
#!/bin/bash

while read f
do echo $f
fname="$(find / -type f -name "*.csv" | grep $f)"
find / -type f -name "*.zip" | grep $f
cp $fname /var/www/backup/
#mv $fname $f
done < 1.csv


echo "scp -p $fname user@remote.host:~"
#mv $fname $f
echo "scp -p script.sh user@remote.host:~"

Надо как то обрабатывать еще дубликаты, которые будут, если похожие имена иметь будем. Тобишь если 2 файла, мы их делаем под 1 именем и далее как то надо от этой проблемы уйти. Да и передача переменных отсутствует.

SysError
() автор топика
Ответ на: комментарий от crutch_master

Команда с переименованием не сработала, возможно другие идеи есть?

SysError
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.