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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Частичная расшифровка команды  (Прочитано 948 раз)

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

Оффлайн Topotyn

  • Автор темы
  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Добрый день. Начал изучать Ububntu и Linux в целом, сейчас читаю книгу по начальному администрировании. В ней приводится в пример команда, в которой мне только часть понятна. Красным цветом выделен участок кода, который требуется мне понять. Заранее спасибо за помощь. Надеюсь в скором будущем перейти на более высокий уровень.

$ find . -type f -name '*.log ' | grep -v .do-not-touch | while read fname;
do echo mv $fname $ {fname/. log/. LOG/}; done | bash -x

Оффлайн vasilisc

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2563
  • г.Северодвинск - строим АПЛ
    • Просмотр профиля
    • Авторские статьи об OpenSource
Re: Частичная расшифровка команды
« Ответ #1 : 15 Мая 2015, 10:40:16 »
find найдет много файлов и передаст их grep, который покажет все кроме .do-not-touch (ключ -v).
Имён файлов будет ещё много и можно сказать что это массив строк.
Этот массив перейдёт на вход цикла While
Он будет обходить строку за строкой и строка-имя-файла-от-find будет лежать в переменной fname
Тело цикла While лежит между Do и Done
там 1 команда переименовки расширения файла, а точнее возведение в верхний регистр.
Могу ошибаться =)

Оффлайн Topotyn

  • Автор темы
  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Частичная расшифровка команды
« Ответ #2 : 15 Мая 2015, 10:51:34 »
Приблизительно понял, буду учить дальше! Спасибо.

symon2014

  • Гость
« Последнее редактирование: 15 Мая 2015, 10:58:30 от symon2014 »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Частичная расшифровка команды
« Ответ #4 : 15 Мая 2015, 11:37:06 »
Topotyn,
Вот так и появляются "быдлокодеры" — так как написана эта команда писать нельзя!
  • Надо стараться сделать операцию минимумом команд.(например одним find — ему это вполне по силам)
  • Конструкция command | while...done как минимум работает неправильно при наличии пробелов в именах, следует использовать while...done < <(command)
  • "$ {" пробела быть не должно
  • Зачем делать  echo команды и передавать её на выполнение в bash, когда можно выполнить саму команду?
  • вместо mv стоит использовать rename для пакетного преобразования файлов
и т.д.Например:
Код: (bash) [Выделить]
find . -type f -name '*.log ' ! -name '*.do-not-touch*' -exec \
    bash -c 'mv "$0" "${0/.log/.LOG}"' {} \;
или
Код: (bash) [Выделить]
while read -r my_dir ; do rename 's/\.log/\.LOG/' "${my_dir}/"* ; done < <(find -type d)
« Последнее редактирование: 15 Мая 2015, 11:39:31 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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