LINUX.ORG.RU

Изменение имени файлов в скрипте.

 , , ,


0

1

Вот скрипт

#!/bin/bash

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

Он читает документ с названиями файлов. Далее ищет по названию и копирует в нужную директорию. Но попадаються под одним именем 2 файла «имя_1» и «имя_2», хотя в поиску он искал «имя». Он их копирует, но хотелось бы изменить на «имя» и «имя1» эти файлы что мы нашли и скопировали. Как это можно решить тут? И возможно перенос переменных можно лучше сделать?

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

Суть в том что нужно что бы найденные 2 файлы или более переименовывались по новой и так как указано в документе с которого мы берем эти значения для поиска. Так как в документе «имя», а находит «имя_1» и «имя_2». Тем самым нужно сказать что копирование делать и заменить эти «имя_1» и «имя_2» на «имя» и «имя01» к примеру.

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

Хотя странно, посмотрел, find хорошо справлятся:

Что тут странного? маска 'file' - найти точно file, маска 'file*' найдёт что угодно на конце, в том числе и просто file. Какой сюрприз...

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

Я же Вам в соседней теме уже сказал, что я не могу тратить на Вашу невнятную писанину время. Научитесь нормально писать проблему и спрашивайте конкретно, что вам в документации на bash непонятно.

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

Мне сейчас не понятно как изменить имя файлам которые я нахожу этим скриптом. Так как по имени которые лежат в документе находит по 2 файла. А их имена мне нужно изменить. В поиске вбивши «имя» находит «имя_1» и «имя_2». Вот их имена нужно заменить на «имя» и «имя01». Или что тут вам не понятно? Только это мне надо вбить в этот скрипт к каждому имени взятому с документа.

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

В поиске вбивши «имя» находит «имя_1» и «имя_2».

Вас это устраивает?

Вот их имена нужно заменить на «имя» и «имя01».

А «имя_3» на что? Неужели непонятно, что ваша постановка задачи какой-то детский сад.

Только это мне надо вбить в этот скрипт к каждому имени взятому с документа.

Вам предлагали начать с начала. Во-первых, bash сам не парсит csv. Во-вторых, вы всё время пишите «в скриптах» какую-то неописанную ранее чушь, то какие-то zip-ы, то какие-то другие csv, ssh; хотя в описании было о каком-то ftp://ftp... О чём это всё? Что за каша?

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

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

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

Меня устраивает то что он находит файлы и их копирует. Но вот после копирования мне надо изменить имя файла. Так как оно не устраивает меня после копирования. «имя_3» и все далее аналогично должно изменяться на «имя03» и так далее...

У меня есть документ с именами. Я с ним что угодно могу делать, главное что бы он читался и через него искало нужные файлы. После чего оно копировала их и переименовывало на то что мне нужно. На имя которое оно берет с документа и убирало дополнительные данные которые есть в имене файла(это после имени идет «_что_то_там»). После всего выше он будет уходить по фтп. Но пока нужно разобраться с тем что выше.

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

Он человек который не троллит, а хоть пытаеться помочь.

И абсолютно зря, потому что ты проявляешь к аудитории полное неуважение. Научись внятно формулировать задачу, потом проси помощи.

Впрочем, как я писал выше - это все бесполезно.

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

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

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

все далее аналогично должно изменяться на «имя03» и так далее...

Офигеть у вас логика. «имя_1» - на «имя», «имя_2» на «имя01», а «имя_3» на «имя03». А почему нет тут «имя01» и «имя02»?

На имя которое оно берет с документа и убирало дополнительные данные которые есть в имене файла(это после имени идет «_что_то_там»)

Вырезание из строки bash делает по разделу документации «Parameter Expansion».

suffix=${name##*_} # берет только последней суффикс, из file_x_1 будет только 1 
name=${name%%_*} # отрезает всё от первого _, из file_x_1 будет file
# создает $new_name со значением из предыдущих имен и суффикса как номера в духзначном виде с лидирующем нулём
printf -v new_name "%s%02d" "$name" "$suffix"

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

А вот команды куда именно вставить в «скрипт»?

Ненадо ничего копи-пастить. Надо почитать документацию, разобрать примеры и писать скрипт по вашей задаче.

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

Я одним глазом поглядываю в ваши темы, но не отвечаю, потому что действительно трудно понять, что вам надо. И дело не в терминологии, а в общей неструктурированности текстов. Вот если бы вы нам показали десяток ваших настоящих файлов (имён) и переименовали бы вручную как вам надо, с минимум текста на русском языке, то было бы проще понять что вам на самом деле надо.

Ну или я за 2к руб согласен разобраться с вашей задачей, решить и объяснить как.

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

ты почти в каждом треде пытаешься помочь

Если вы так пристально изучаете мои посты, то должны были заметить, что я редко коментарю его изначальные посты, а всё начинается с коментариев к другим. Но на это получаю дополнительные посты от самого автора. Не отвечать на них тоже не вежливо, но я как могу разъясняю, почему и не очень хотелось.

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

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

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

Я долго читал молча этот тред. Но тут даже я не выдержал.
Кто этот поток сознания на тебя вылил? За что с тобой так?
Как люди с такой постановкой вопросов вообще выживают в нашем сложном мире?!

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

Написать скрипт

Тут все понятно

принимал бы текствовий файл с N путем,

Это тоже очевидно, путь надо указывать к файлу со списком

в нем лежит список файлов

Тут, стоит уточнить какого формата должен быть файл, и чем является содержимое списка файлов. Простой вариант, одна строка, один абсолютный путь до файла, например:
/home/someuser/example.file\n
/home/someuser/example1.file\n

который надо залить на ФТП

Файлов то много, надо писать которыЕ
Про заливку на FTP тоже все понятно.

и записывать его с именем который мы указали в поиске

Это уже НЕХ пошел. Сразу видно - вырвано из контекста. Надо уточнить что за поиск, зачем это делать, и что туда вводят.

На выходе должны быть 2 файла:

Из текста не ясно, о каком выходе идет речь. Ранее в тексте объявлялось, что файлЫ надо было заливать на FTP, пусть и с измененным именем, но на FTP будет файлов ровно столько, сколько указано в списке.

1 - имеют все файлы. 2 - сам скрипт.

Теперь я так понимаю, что выход, это собственно результат работы ТС-а
Т.е. От тебя требуют, что бы ты сформировал этот список и сам скрипт, это и будет результат твоей работы.

Путь к файлам должен быть полный.

Путь, указывают тебе в задании, должен быть полый - т.е. список должен быть подобен тому, как я в примере выше указал.

Использовать горбатую запись.

хахахаха, это просто смешно.

Скрипт должен быть поделен на 2 части.

Это уже не техническая необходимость, а пожелания заказчика, вероятно на чем-то основанное, но т.к. все это вырвано из контекста - понять нельзя.

Некоторые имена имеют 2 файла.

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

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

Грубо говоря. Дали задачу, но ты ее делай на тестовой машине, все сам создавай и все тестируй. А там не файлов нечего. Я по тому что мне дали создаю документ(любой формат и любое содержания, главное что бы имена были файлов которые искать и копировать). Далее в скрипте указываю какой файл читать(но я на сколько понял, что он хочет что бы был указан примой путь именно к документу с именами). После чего скрипт читает 1-е имя, ищет его на машине, если там 2 файла то копирует 2 файла, но с заменой на имена которые указаны в документе с именами. Так как почти все файлы указаны как «имя_123», а он хочет что бы было по другому. Просто «имя» и «имя01» к примеру. На счет разбития скрипта на 2 части, это что бы проще было кому либо его прочитать и понять что там в скрипте. И на счет файлов, их пару тысяч.

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

На счет разбития скрипта на 2 части, это что бы проще было кому либо его прочитать и понять что там в скрипте

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

Использовать горбатую запись.

А это что, плохой перевод на русский?

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

Итого, твоя задача сводится к следующим простым действием:
1. Формирования списка
2. Поиску файлов по маске
3. Переименование по необходимости найденных файлов
4. Перемещение полученных файлов туда-то
Результатом твоей работы, будет собственно файл списка и сам скрипт, а результатом работы скрипта и списка - наличие нужных файлов на FTP сервере. Можешь приступать.

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

Использовать горбатую запись.

Это так он называет переменные.

Вот что мне посоветовали и на чем я остановился:

#!/bin/bash

while read f
do echo $f
fname="$(find / -type f -name "*.csv" | grep $f)"
find / -type f -name "*.csv" | grep $f
cp $fname /var/www/backup/
#mv $fname $f - это не работает.
done < 1.csv

SysError ()
Ответ на: комментарий от SysError
fname="$(find / -type f -name "*.csv" | grep $f)"
find / -type f -name "*.csv" | grep $f

Полное непонимание. Это не просьба «помочь», это просьба «напишите за меня сначала ТЗ, а потом сделайте за меня работу».

Зачем два раза делать поиск?

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

Столкнулся с проблемой переименования дубликатов. Как можно указать, что только дубликаты переименовывать, да что бы первый файл дубликата был просто имя, а второй с цифрой. Это к пункту 3, что вы писали как план. С остальным разобрался, все делает.

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

while read f
do echo $f
rename="$(find /var/www/backup -type f -name "*.csv" | grep $f)"
j=$f
let j+=1
sudo mv "$rename" "/var/www/backup/$f$j.csv"

done < /var/www/1.csv

SysError ()