LINUX.ORG.RU

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

 , ,


1

1

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



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

я могу написать скрипт для поиска файла и копирования его текста за N путем в котором лежить список файлов которые нужно залить на ФТП и указывать с именем которое вы указали в поиске. На выходе будут 2 файла. В одном все файлы, во втором сам скрипт. Путь к файлу где все лежит будет полным. Да и разделить скрипт на 2 части могу

Есть только одна проблема, я не понял из описания как это должно работать

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

Здраствуйте. Я, Кирилл. Хотел бы чтобы вы сделали игру, 3Д-экшон bash скрипт, суть такова

crutch_master ★★★★★
()

По моему скромному анонимному(sic!) мнению, лучше написать на каком-нибудь питоне.

anonymous
()
Ответ на: комментарий от futurama

Есть файл в котором указаны все названия нужных для копирования файлов. Там их 3000+. И с этого файла он берет эти данные переносит на ФТП. Но имя вписывает то которое заданно в файле, так как есть файлы с более длинным именем.

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

Но имя вписывает то которое заданно в файле, так как есть файлы с более длинным именем.

Чаво?

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

К примеру. Имя указано в файле «лог» а в базе оно подписано как «лог_123», тем самым нужно избавиться при копировании на ФТП приписки «_123»

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

Там вписаны все имена файлов и они краткие. Пример «лог». Но как я писал ранее есть файлы с именем «лог_123», но надо при копировании сделать краткое имя «лог» как указано в файле с именами.

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

Нужен скрипт который открывает файл в котором 3000+ имен других файлов которые нужно перенести по ФТП. Имена там краткие «лог», а на серваке храняться как «лог_123». Вот и надо все эти файлы перенести по ФТП, но с нормальным именем без доп приписки как «_123». Да и иметь на выходе 2 файла скрипт и все файлы которые он скопирует. И сделать полный путь где это все будет храниться.

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

Или есть возможно другой спосов как это провернуть? Да и если оставлять имена такие какие есть.

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

Да залить все файлы со списка файла xls на ФТП сервак. Тем самым что бы получилось на выходе скрипта 2 файла. Сам скрипт и файл где все вот эти скопированые будут элементы со списка xls. Вот такое пока набросал.

#!/bin/bash

while read line ; do
  IFS=".zip"
  set -- $line
  filename=$1
  echo -e "$filename\n" 
done < filename.xls 

NameF="$1"
FindF="*.zip"
DirF="cd /backup/"

find ./ -name $FindF | grep -i $NameF -exec cp $NameF $DirF$NameF
SysError
() автор топика
Ответ на: комментарий от SysError

Тем самым что бы получилось на выходе скрипта 2 файла. Сам скрипт файл

Сам скрипт на выходе скрипта? Он сам себя скопировать должен?

где все вот эти скопированые будут элементы со списка xls

Надо записать что он скинул на ftp и куда?

Для начала xls перевести в обычный txt одно полное имя файла (или что там) на строку.

Вот такое пока набросал.

#!/bin/bash

while read line ; do
  IFS=".zip" # что это, почему разделитель ".zip"?
  set -- $line # это вообще что такое и зачем?
  filename=$1 # почему имя файла - это первый агрумент скрипта?
  echo -e "$filename\n" # зачем делать -e и \n? может просто делать echo?
done < filename.xls # КАК он должен прочитать xls? Это бинарный файл там может быть любая каша между ".zip".

NameF="$1"
FindF="*.zip"
DirF="cd /backup/"

find ./ -name $FindF | grep -i $NameF -exec cp $NameF $DirF$NameF
# Что тут происходит я вообще не понял зачем грепать? Зачем find? Зачем поставлять "cd /backup/" в cp? 
# Перестань, пока всё не сломал!
crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

1. Да сделать копию этого скрипта в папку куда будет он копировать все данные с файла xls. 2.Нет, просто что бы все вот эти файлы были в одном файле. То что он найдет и скопирует запихнуть в один файл. 3.А через сам xls не выйдет? Просто там по мимо имени файлов есть их данные, как размер и дата. 4. Мне скинули самые нижние команды как то чем они до этого искали. Без скрипта. Потому набросок такой. И в самом наброске(хаосе) вот данные с

while read line ; do
до
done < filename.xls
я нашел в статейке где описано что 1 значение выставляет делимитер разбивки и set — $line разбиваем строку, после чего каждая ее часть будет доступна как $1, $2

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

Перегони xls в cvs разбитый табами, забирай что надо через cut. Зачем вот весь этот изврат? Тем более тебе ничего не нужно кроме имени.

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

Ты че карму чистишь? У тебя там сущность в виде гномика? Или из тебя утром черепаха вышла?

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

Там конвейер, понимаешь? Ты делаешь cat file.csv и тебе вываливаются данные в 3 столбика. Потом ты делаешь cat file.csv | cut -f 1 и у тебя только первый столбик. Потом ты делаешь cat file.csv | cut -f 1 | while read f; do ...; done и это будет что-то с каждым значением из 1-го столбика. Что предсавляет из себя это «что-то» я так и не понял, но ты сделай это «что-то» для сначала для одного файла, а потом подставь куда надо $f.
И помни, главное - это бекапы и делать echo команды до того, как ты попытаешься её выполнить. То есть, не делать сразу cp $a $b. Сделай echo "cp $a $b" и если всё нормально, убирай echo.

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

После того как я выполню команду

cat file.csv | cut -f 1 | while read f;
у меня будут эти бэкапы как бы? Это представляет собой zip файлы. Точнее имена этих файлов которые надо найти на одной машине где я запускаю скрипт и перенести по ФТП.

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

у меня будут эти бэкапы как бы?

Я не знаю что у тебя там, может быть и бекапы. А может они во втором стоблце. Запусти да посмотри. «Общайся» с башем.

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

Я понял, что ты хочешь меня подколоть, но не понял как. Непонятный тред какой-то. ОПу непонятно что надо, анон непонятно хочет подколоть, я еще после рабочего дня вообще ничего не соображаю.

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

Я к тому что я этой одной строкой получу все что мне нужно? Тоесть все файлы будут у меня в той папке где я скрипт запустил? Пока не могу запустить так как доступ временно недоступен к машине.

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

Я о том что иметь буду файлы которых указаны имена в папке с которой запустил скрипт?

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

После чего я их отправляю куда мне нужно по фтп

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

Так далее после того как я получил как вы говорите что-то, я не могу понять что именно мне выдаст. Файлы(по имени которые там указаны) или данные с того столбца. И что мне надо дальше прописать. Типо что эти файлы идут как $f и ее копировать куда надо?

SysError
() автор топика

Я читать-читать твоя текст, ничего не понять, ничем не могу помогать.

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

mord0d ★★★★★
()

То что нужно сделать я описал. Я не знаю как правильно мне взять с файла данные(но уже выше пояснили) и от этих данных(имен) файлов скопировать их в один файл который потом перенести по ФТП. Вот нужен скрипт что бы это сделал

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

Теперь он просто попросил найти файлы на машине которые указаны в файле, который я уже переделал в csv, их переименовать и скопировать по ФТП.

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

Как бы 3 действия в скрипте. Но вот момент с поиском я не понимаю.

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

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

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

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

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

cat твой вывод или что у тебя там | while read filename; do find траляля; cp аляля траляля; done
while read же делал? Делал. Ну и всё, в чем проблема? Прочитай одну строчку, поставь её в твои команды, которые копируют ищут и что там надо.

, но вот что дальше дописать что бы скрипт брал имена файлов, находил их на машине и копировал по фтп.

Разбей задачу на подзадачи и решай всё последовательно. Значение из строчки ты знаешь как взять, подставить знаешь как. Сделай отдельно find, отдельно заливку на ftp, подставь что надо из while read.

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

Выходит как то так.

#!/bin/bash

cat 1.csv
cut -f 1
while read 1.csv; do find $f; echo "cp $f /var/www/backup/"; done;
Но на выходе получаю вывод тестовых имен файла и скрипт висит.

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

Ну всё правильно. Ты выводишь файл 1.csv. Потом ты выводишь 1-е поле у строки разделённой табами со стандартного ввода. Потом ты читаешь стандартный ввод и сохраняешь строку в переменную «1.csv». Он ждет данные со стандартного ввода для cut -f 1. Понятно что не так? Если тебе надо выхлоп cat передать cut то делаешь вот так: cat file.csv | cut -f 1 Дальше всё так же cat file.csv | cut -f 1 | while read f; do echo $f; done

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

Да теперь оно работает.

#!/bin/bash

cat 1.csv | cut -f 1 | while read f; do echo $f; find -name $f; echo "cp $f /var/www/backup/"; done
А сам путь где храняться файлы можно вывести и изменить имя если оно длиннее чем указано в списке что находиться в документе который мы читаем?

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

Вот, хорошо.

А сам путь где храняться файлы можно вывести и изменить имя если оно длиннее чем указано в списке что находиться в документе который мы читаем?

У тебя find -name $f их находит? Что делать если найдет больше одного? Если он один, можно делать так:

fname=$(find -name $f)
это сохранит выхлоп в переменную. Если надо сохранять больше одного делай такой же цикл и всё.
find у тебя, кстати не работает, он просто выплюнет то, что нашел и всё. В echo ты подставлаешь $f, которое у тебя читается из 1.csv
В файл всё записывается через перенаправление потоков. echo «alala» >> file.txt допишет alala в конец file.txt. Загугли про это дело.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от crutch_master
sudo ./test.sh
2.csv
./2.csv
cp 2.csv /var/www/backup/
3.csv
./3.csv
cp 3.csv /var/www/backup/
4.csv
./4.csv
cp 4.csv /var/www/backup/

Вот что у меня на тесте выдает.

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

Это с той команды что я написал выше

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

Да на счет поиска он не работает. Пробовал только что сделать 5тый файл в другой директории. И он не ищеться и не копируеться.

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

Всё правильно.
Он читает файл. Там 2.csv. Он его выводит. Потом он делает find. То есть find -name $f; или find -name 2.csv находит его, о чём тебе и говорит: ./2.csv. Потом делает echo "cp $f /var/www/backup/" Тут правильный вывод.

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

И он не ищеться и не копируеться.

Пробуй по элементарным действиям, всё найдется. Делаешь find он тебе что-нибудь выплёвывает. Берешь этот выхлоп пихаешь его дальше.

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

Допустил ошибку в имени. Извините.

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