Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Создание нескольких каталогов по списку etc...  (Прочитано 1355 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн hesoyamatogun

  • Автор темы
  • Активист
  • *
  • Сообщений: 347
    • Просмотр профиля
Здрасти. Есть список в файле с названиями будущих каталогов. Необходимо их создать одной командой. Как это сделать?

ТС не появлялся на Форуме более полугода по состоянию на 09/09/2019 (последняя явка: 11/01/2019). Модератором раздела принято решение закрыть тему.
--zg_nico
« Последнее редактирование: 09 Сентября 2019, 18:51:17 от zg_nico »

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: Создание нескольких каталогов по списку
« Ответ #1 : 20 Ноября 2017, 22:06:34 »
while read d; do mkdir "$d"; done < spisok.txt

Оффлайн hesoyamatogun

  • Автор темы
  • Активист
  • *
  • Сообщений: 347
    • Просмотр профиля
Re: Создание нескольких каталогов по списку
« Ответ #2 : 20 Ноября 2017, 22:21:47 »
Угу, все гуд. А если список во входящем потоке?

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: Создание нескольких каталогов по списку
« Ответ #3 : 20 Ноября 2017, 22:42:40 »
вывод | while read d; do mkdir "$d"; doneили:
вывод | xargs -d'\n' mkdir

Оффлайн hesoyamatogun

  • Автор темы
  • Активист
  • *
  • Сообщений: 347
    • Просмотр профиля
Re: Создание нескольких каталогов по списку
« Ответ #4 : 20 Ноября 2017, 23:51:15 »
Супер. С первой понятно, со второй куда вписать абсолютный путь? после mkdir -p /путь не работает.

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: Создание нескольких каталогов по списку
« Ответ #5 : 21 Ноября 2017, 14:25:30 »
вывод | xargs -I{} -d'\n' mkdir "/путь/{}"

Оффлайн hesoyamatogun

  • Автор темы
  • Активист
  • *
  • Сообщений: 347
    • Просмотр профиля
Здраствуйте снова. Еесть значит файл в котором информация сгруппирована блоками и в общих чертах он имеет вид такой:

Номер 0001   Идентификатор: 37458793
             Область:3
             Значение:100
             Каталог:d6iy54
Номер 0002   Идентификатор: 32432443
             Область:33
             Значение:300
             Каталог:d6nd77
Номер 0003   Идентификатор: 75487375
             Область:3
             Значение:100
             Каталог:hflgl
И так далее, структура примерно такая.
Задача следующая. Пройтись последовательно по файлу скриптом-обработчиком выполнив следующие действия:
1 - там где строка "Каталог", должен быть создан каталог с этим именем. Это я сделал с вашей помощью:

# Вычленяет название каталогов и создает их
cat /telemetry/.temp | grep Каталог | cut -c18- | rev | cut -c2- | rev | while read d; do mkdir -p /telemetry/"$d"; done

2 - там где остальные строки, например "Область", должен быть создан файл с этим именем в каталоге d6nd77 и значением 33

Думаю что нужно в первый цикл встраивать пока актуальна переменная $d. Перед этим подсчитать число блоков текста и с каждой итерацией
цикла брать со смещением строку по номеру от начала файла.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6690
  • 20% Cooler
    • Просмотр профиля
Одним циклом =)
Код: (bash) [Выделить]
#!/bin/sh
LIST=`tac <<<$(sed -n 's/.*Каталог:\|.*Область://p' /telemetry/.temp)`
COUNT=`sed -n '$=' <<< "$LIST"`
for i in `seq 1 2 $COUNT`; do
  DIR=`sed -n ${i}p <<< "$LIST"`
   i=$(( i+1 ))
  FILE=`sed -n ${i}p <<< "$LIST"`
    mkdir -p "/telemetry/$DIR"
    touch "/telemetry/$DIR/$FILE"
done

создан файл с этим именем в каталоге d6nd77 и значением 33
Непонятно. Область - имя файла, Значение - то что в файле? Тогда так.
Код: (bash) [Выделить]
#!/bin/sh
LIST=`tac <<<$(sed -n 's/.*Каталог:\|.*Область:\|.*Значение://p' /telemetry/.temp)`
COUNT=`sed -n '$=' <<<"$LIST"`
for i in `seq 1 3 $COUNT`; do
  DIR=`sed -n ${i}p <<< "$LIST"`
   i=$(( i+1 ))
  VAL=`sed -n ${i}p <<< "$LIST"`
   i=$(( i+1 ))
  FILE=`sed -n ${i}p <<< "$LIST"`
      mkdir -p "/telemetry/$DIR"
      echo "$VAL" > "/telemetry/$DIR/$FILE"
done
« Последнее редактирование: 21 Ноября 2017, 16:36:45 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн hesoyamatogun

  • Автор темы
  • Активист
  • *
  • Сообщений: 347
    • Просмотр профиля
>>>Непонятно. Область - имя файла, Значение - то что в файле? Тогда так.
Неа не так, Область, Значение, Идентификатор - Это всё файлы, которые должны лежать в каталогах.
Номер 0001   Идентификатор: 37458793 # Файл Идентификатор, содержащий в себе текст 37458793
             Область:3 # Файл Область, внутри него текст "3" без кавычек
             Значение:100 # То же самое.
             Каталог:d6iy54 Каталог с названием d6iy54, содержащий в себе вышеупомянутые файлы
Если скрипт пойдет второй раз, он перепишет содержимое файлов и создаст и заполнит новый каталог, если появится новый блок. Он так и будет ходить циклически примерно раз в секунду.

Можно немного менее профессиональным стилем дабы было немного понятно начинающему. :)
Про утилиту sed вообще не слыхал, как и про '>>>' ,еще блин старое не утряслось а тут такое
« Последнее редактирование: 21 Ноября 2017, 17:32:10 от hesoyamatogun »

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Код: (perl) [Выделить]
#!/usr/bin/perl

my $d = '/telemetry';

my $n;
my %h;
while (<>) {
$n = $1 if (/^\s*Номер\s+(\d+)/);
if ($n) { $h{$n}{$1}=$2 if (/(\S+)\s*:\s*(\S+)/) }
}

for my $n (keys %h){
my $dir = $h{$n}{'Каталог'};
if ($dir){
delete $h{$n}{'Каталог'};
unless (system "mkdir -p \"$d/$dir/\""){
for my $f (values %{$h{$n}}){
system "echo \"$f\" > \"$d/$dir/$f\"";
}
}
}
}


Запуск:
perl script.pl file.txt
PS: За такое нужно благодарить ($)

Оффлайн hesoyamatogun

  • Автор темы
  • Активист
  • *
  • Сообщений: 347
    • Просмотр профиля
Благодарить ($)? Согласен но еще ничего не работает. Что sed что perl это наверно хорошо, когда первое и второе китайская грамота. Желательно бы на баше чтобы самому понятно было, ибо всё по порядку. Такая структура пойдет через уарт в программу на си чтоб там уже не мудрить с текстом. Типа запрос-ответ.

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Код: (bash) [Выделить]
sed -n '
    /З/{
        s/.*://;
        h;
        d;
    };
    /К/{
        s/.*:\(.*\)/mkdir \1 ; echo "33" > \1\//;
        G;
        s/\n//e}
    ' /telemetry/.temp

Пользователь добавил сообщение 21 Ноября 2017, 18:04:43:
Пока писал пошли уточнения. В каталоге должны быть 3 файла со значениями справа от ":"?
« Последнее редактирование: 21 Ноября 2017, 18:04:43 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6690
  • 20% Cooler
    • Просмотр профиля
sed - построчный редактор, умеет очень много, инфы в интернете полно.
Тык: <<<
Скрипт на баше с комментариями
(Нажмите, чтобы показать/скрыть)

« Последнее редактирование: 21 Ноября 2017, 18:15:59 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
не работает
Что именно? есть вывод ошибки?

Оффлайн hesoyamatogun

  • Автор темы
  • Активист
  • *
  • Сообщений: 347
    • Просмотр профиля
Да три, но их на самом деле будет больше, но всегда одинаковое количество в каждом каталоге.
Называться они будут одинаково,в одном порядке но содержать разные значения. И, кстати говоря, значение будет одинаковым тоже в смысле количества символов в нем. Разделитель не обязательно двоеточие, его вообще может не быть а может и другой разделитель и единицы измерения после него в сырых данных в том файле .temp. Все это с начала строки и в конце, например единицы измерения посрезать конструкцией | cut | rev | cut | rev , так как это позволяет хотя бы видеть что просиходит и подправить в случае чего.

Не работает пока вся программа, я знаю точно что должно быть но хреново понимаю как сделать.
« Последнее редактирование: 21 Ноября 2017, 18:22:05 от hesoyamatogun »

 

Страница сгенерирована за 0.035 секунд. Запросов: 23.