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


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

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

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

Оффлайн hesoyamatogun

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

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

Оффлайн ReNzRv

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

Оффлайн hesoyamatogun

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

Оффлайн ReNzRv

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

Оффлайн hesoyamatogun

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

Оффлайн ReNzRv

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

Оффлайн hesoyamatogun

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

Номер 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. Перед этим подсчитать число блоков текста и с каждой итерацией
цикла брать со смещением строку по номеру от начала файла.

Оффлайн ALiEN175

  • Модератор форума
  • Старожил
  • *
  • Сообщений: 4307
  • Capture the truth
    • Просмотр профиля
Одним циклом =)
Код: Bash
  1. #!/bin/sh
  2. LIST=`tac <<<$(sed -n 's/.*Каталог:\|.*Область://p' /telemetry/.temp)`
  3. COUNT=`sed -n '$=' <<< "$LIST"`
  4. for i in `seq 1 2 $COUNT`; do
  5.   DIR=`sed -n ${i}p <<< "$LIST"`
  6.    i=$(( i+1 ))
  7.   FILE=`sed -n ${i}p <<< "$LIST"`
  8.     mkdir -p "/telemetry/$DIR"
  9.     touch "/telemetry/$DIR/$FILE"
  10. done

создан файл с этим именем в каталоге d6nd77 и значением 33
Непонятно. Область - имя файла, Значение - то что в файле? Тогда так.
Код: Bash
  1. #!/bin/sh
  2. LIST=`tac <<<$(sed -n 's/.*Каталог:\|.*Область:\|.*Значение://p' /telemetry/.temp)`
  3. COUNT=`sed -n '$=' <<<"$LIST"`
  4. for i in `seq 1 3 $COUNT`; do
  5.   DIR=`sed -n ${i}p <<< "$LIST"`
  6.    i=$(( i+1 ))
  7.   VAL=`sed -n ${i}p <<< "$LIST"`
  8.    i=$(( i+1 ))
  9.   FILE=`sed -n ${i}p <<< "$LIST"`
  10.       mkdir -p "/telemetry/$DIR"
  11.       echo "$VAL" > "/telemetry/$DIR/$FILE"
  12. done
« Последнее редактирование: 21 Ноябрь 2017, 16:36:45 от ALiEN175 »
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Nvidia 8500GT :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн hesoyamatogun

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

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

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Код: Perl
  1. #!/usr/bin/perl
  2.  
  3. my $d = '/telemetry';
  4.  
  5. my $n;
  6. my %h;
  7. while (<>) {
  8.         $n = $1 if (/^\s*Номер\s+(\d+)/);
  9.         if ($n) { $h{$n}{$1}=$2 if (/(\S+)\s*:\s*(\S+)/) }
  10. }
  11.  
  12. for my $n (keys %h){
  13.         my $dir = $h{$n}{'Каталог'};
  14.         if ($dir){
  15.                 delete $h{$n}{'Каталог'};
  16.                 unless (system "mkdir -p \"$d/$dir/\""){
  17.                         for my $f (values %{$h{$n}}){
  18.                                 system "echo \"$f\" > \"$d/$dir/$f\"";
  19.                         }
  20.                 }
  21.         }
  22. }
  23.  
  24.  

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

Оффлайн hesoyamatogun

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

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6015
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Код: Bash
  1. sed -n '
  2.    /З/{
  3.        s/.*://;
  4.        h;
  5.        d;
  6.    };
  7.    /К/{
  8.        s/.*:\(.*\)/mkdir \1 ; echo "33" > \1\//;
  9.        G;
  10.        s/\n//e}
  11.    ' /telemetry/.temp

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

Оффлайн ALiEN175

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

« Последнее редактирование: 21 Ноябрь 2017, 18:15:59 от ALiEN175 »
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Nvidia 8500GT :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн ReNzRv

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

Оффлайн hesoyamatogun

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

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

 

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