LINUX.ORG.RU

Каталоги, подкаталоги, файлы и bash

 


0

1

Всем доброго времени суток.

Прошу сильно не пинать. Есть каталог с кучей подкаталогов, в которых лежат файлики. Грубо говоря выглядит это так:

Каталог
    Подкаталог
      Файл
      Файл1
    Подкаталог1
      Файл
      ...

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

По идее, путь до каталога и подкаталоги неизменны. Но, как упихать это в массив с нужным выводом не придумал.



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

ls -R если хочется дефолтных средств.

Или есть отдельная утилита tree, если хочется, чтобы красиво.

shell-script ★★★★★
()
Ответ на: комментарий от r3lgar

Надо учиться сразу писать подобробно

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

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

Понятнее не стало. Что за действия? Файлы неизменны? Если всё неизменно то просто захардкодь пути и выполняй что там тебе вздумается, я ничего не понял вообще!

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

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

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

А зачем тогда такая структура нужна? Или ее не надо отображать, а просто вы описали как ваши каталоги выглядят?

В общем, правильно ли я понял - вам надо взять все файлы из каталога и вложенных в него подкаталогов и просто отправить их на почту? Ну то есть получить список файлов по типу выполнения find /путь/к/каталогу -type f? Или как-то структура каталогов тоже должна учитываться?

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

В этом и проблема, что важна структура. Просто собрать все файлики и отправить я уже сообразил и мне тут даже помогли их собрать в одно большое вложение без использование архивов. Проблема в том, что есть каталог Москва и из него файлы надо отправить на moscow@yandex.ru, за ним идет каталог Иваново и из него шлем на ivanovo@yandex.ru и т.д.

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

Скорее всего тут find не понадобится, достаточно будет for fn in my/data/path/*

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

Переменная=путь. Например:

Moscow=/path/to/moscow
Novgorod=/path/to/novgorod
А дальше или архивируешь через переменную все, что есть в папке или через find и что-еще нужно.

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

Так а в чём проблема-то? Хоть создавай каталоги прямо в виде адреса e-mail, чтобы всё уж было ясно.

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

Предлагаю такой алгоритм:

1. Собрать массив из «имя каталога = почтовый ящик»

2. В цикле пройтись по основному каталогу, собирая список каталогов с именами городов (тот же find /path/ -maxdepth 1 -mindepth 1 -type d или какой-нибудь башевый аналог, который я что-то не могу вспомнить)

3. По этому списку проходимся опять циклом, элемент списка поможет получить ящик из массива из пункта 1, какой-нибудь find поможет собрать список файлов (или «/основнойКаталог/элементСписка(т.е. город)/*»), а как отправить их вы уже знаете

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

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

Ну, например, так можно:

#!/bin/bash
declare -A cities
cities=(
[Нерезиновая]=moscow@example.org
[Мухосранск]=flyshitburg@example.org
[Болота]=spb@example.org
)
for city in "${!cities[@]}"; do
  email="${cities[$city]}"
  echo city=$city email=$email
  cd "$city"
  /usr/local/bin/скрипт_который_отправляет_почту.sh "$email"
  cd ..
done

Идея с директориями, названными как почтовые адреса тоже норм, но не все юзеры хорошо читают адреса на латиннице, и не все почтовики работают с кириллическими адресами.

Другой вариант - таблицу мыло=город положить в файл и читать в цикле

while read email city ; do 
  echo city=$city email=$email
  cd "$city"
  /usr/local/bin/скрипт_который_отправляет_почту.sh "$email"
  cd ..
done < cities.txt
cities.txt:
moscow@example.org Нерезиновая
flyshitburg@example.org Мухосранск
spb@example.org Санкт-Петербург
nn@example.org Нижний Новгород С Пробелами

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

Вместо

  cd "$city"
  /usr/local/bin/скрипт_который_отправляет_почту.sh "$email"
  cd ..
лучше использовать сабшелл, чтобы при отсутствии директории cd не пошёл вразнос:
  (
    cd "$city"
    /usr/local/bin/скрипт_который_отправляет_почту.sh "$email"
  )

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

Да, а с учетом того, что копание в самом баше идет на ходу, так совсем весело.

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