Мини задача на BASH

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Savvis
Сообщения: 4
ОС: CentOS 5.2

Мини задача на BASH

Сообщение Savvis »

Есть задача:
Перeмeстить из тeкущего каталога всe файлы с имeнами начинающимися на А и заканчивающимися на P в другой каталог. Послать письмо администратору с имeнами пeрeмещeнных файлов.

Каталог храним в переменной.
Дошёл до состояния вывода на экран в многострочном виде этих файлов:

Код: Выделить всё

ls | grep a*p\..*

a6666666p.txt
ayyyuuuyy.txt
abbbbp.123
Дальше предполагаю разбить этот текст на \n, переместить каждый файл и после перемещения отправить письмо. Не знаю как это реализовать. Подскажите пожалуйста.

ps: Наверняка это делается другими более короткими способами.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Мини задача на BASH

Сообщение SLEDopit »

вывод суньте в письмо админу(сохраните в файл с помощью ">"), а файлы по моему всю жизнь с помощью mv перемещались.
mv a*p.* /destionation/dir (ну или $variable)
правда тут один недостаток: файл с именем а-ля a111p.kfjel.txt тоже переместится вместе со всеми, но в принципе это тоже можно исключить - просто думать уже лень :)
зы имейте в виду что регистр в имени файлов учитывается.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Мини задача на BASH

Сообщение watashiwa_daredeska »

Savvis писал(а):
11.11.2008 21:39
Есть задача:
Перeмeстить из тeкущего каталога всe файлы с имeнами начинающимися на А и заканчивающимися на P в другой каталог. Послать письмо администратору с имeнами пeрeмещeнных файлов.
Savvis писал(а):
11.11.2008 21:39
Дальше предполагаю разбить этот текст на \n, переместить каждый файл и после перемещения отправить письмо.
Savvis писал(а):
11.11.2008 21:39
ps: Наверняка это делается другими более короткими способами.
Звучит просто потрясающе :)

Навскидку предложу составные части для решения задачи, ибо решать лениво.
  • из тeкущего каталога всe файлы с имeнами начинающимися на А и заканчивающимися на P == ls A*P и никакого grep.
  • Опция --target-directory у GNU mv
  • xargs
  • mail
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Мини задача на BASH

Сообщение diesel »

Код: Выделить всё

diesel@debian:/tmp/tmp1$ ls
a_p.1  a_p1.2  a_p.2
diesel@debian:/tmp/tmp1$ ls ../tmp2/
diesel@debian:/tmp/tmp1$ ls [Aa]*[pP].*
a_p.1  a_p.2
diesel@debian:/tmp/tmp1$ ls [Aa]*[pP].* | xargs  mv -t ../tmp2/
diesel@debian:/tmp/tmp1$ ls
a_p1.2
diesel@debian:/tmp/tmp1$ ls ../tmp2/
a_p.1  a_p.2
diesel@debian:/tmp/tmp1$ mv ../tmp2/* .
diesel@debian:/tmp/tmp1$ ls [Aa]*[pP].* | tee -a file.log| xargs  mv -t ../tmp2/
diesel@debian:/tmp/tmp1$ ls
a_p1.2  file.log
diesel@debian:/tmp/tmp1$ cat file.log
a_p.1
a_p.2
diesel@debian:/tmp/tmp1$ ls ../tmp2/
a_p.1  a_p.2
diesel@debian:/tmp/tmp1$
Спасибо сказали:
Savvis
Сообщения: 4
ОС: CentOS 5.2

Re: Мини задача на BASH

Сообщение Savvis »

SLEDopit, watashiwa_daredeska, diesel Спасибо!
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: Мини задача на BASH

Сообщение Goodvin »

Savvis писал(а):
11.11.2008 21:39
Есть задача:
Перeмeстить из тeкущего каталога всe файлы с имeнами начинающимися на А и заканчивающимися на P в другой каталог. Послать письмо администратору с имeнами пeрeмещeнных файлов.

Дошёл до состояния вывода на экран в многострочном виде этих файлов:

Код: Выделить всё

ls | grep a*p\..*

a6666666p.txt
ayyyuuuyy.txt
abbbbp.123
Извините, но это решение неверное.
Вы выбрали файлы, имена который начинаются на "а", а заканчиваются на "р.<всякая фигня>"
Хотелось бы заметить, что в линуксе нет такого понятия как "расширение файла".
У файла есть просто имя. и ВСЁ.
А то, что в имени файла есть где-то какая-то точка - это для системы ровным счетом ничего не меняет.

Так что либо задание поставлено неверно, либо Вы неверно его пытаетесь реализовать.

P.S.
Странно, что никто не заметил этой грубой принципиальной ошибки.
Такая оплошность может привести к серьеpным последствиям и можно долго-долго рыться в посиках причин.
Спасибо сказали:
Prividenie
Сообщения: 8

Re: Мини задача на BASH

Сообщение Prividenie »

Goodvin писал:
"Вы выбрали файлы, имена который начинаются на "а", а заканчиваются на "р.<всякая фигня>""

как я понимаю изначально (у автора темы) в файлах принято расширение из 3 символов и имя файла он принимает до расширения (как в досе)
можно жестко ограничить расширение до 3 символов a*p.???
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: Мини задача на BASH

Сообщение Goodvin »

Prividenie писал(а):
19.11.2008 02:46
Goodvin писал:
"Вы выбрали файлы, имена который начинаются на "а", а заканчиваются на "р.<всякая фигня>""

как я понимаю изначально (у автора темы) в файлах принято расширение из 3 символов и имя файла он принимает до расширения (как в досе)
можно жестко ограничить расширение до 3 символов a*p.???
Дело в том, что в линуксе нет никакого расширения.
Вообще.
Поэтому рассуждать об этом бессмысленно.
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Мини задача на BASH

Сообщение Subj »

Вообщето правильней вроде как так:
grep "[aA].*[pP]\..*"

иначе получается следующее:
$ ls |grep "a*p\..*"
nohup.out


Почитайте про предназначение * (звездочки) в регулярках
Building better software with Ada
Спасибо сказали:
Savvis
Сообщения: 4
ОС: CentOS 5.2

Re: Мини задача на BASH

Сообщение Savvis »

Goodvin
Да вы оказались правы. Преподаватель это первое, что подправил.
Решил я задачу вот так:

Код: Выделить всё

#!/bin/sh

clear
log="wlog.txt"

echo "Input the name of newdir:"
read newdir

case "$1" in
  1   )
echo "1 variant"
ls [A-P]*\.* | tee -a $log | xargs mv -t $newdir
;;
  2   )
echo "2 variant"
find . -maxdepth 1 -type f -name '[A-P]*\.*'>$log
cat $log | xargs mv -t $newdir
;;
  3   )
echo "3 variant"
find . -maxdepth 1 -type f -name '[A-P]*\.*' -print -exec mv '{}' $newdir \; > $log
;;
esac

mail -s "Report" root@server < $log
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Мини задача на BASH

Сообщение drBatty »

Savvis писал(а):
27.09.2009 15:54
ls [A-P]*\.*

это имена, которые начинаются на буквы ABCDEFGHIJKLMNOP, и не на какие на другие.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: