N-ART N 2 2019

Маффынка. Прислали нам такой вот арт, от нашего постоянного автора. Не знаю, как вам, но меня чем-то зацепило, посему опубликую.

Вызовет попоболь у Печальной Коровы, да и хер с ней.

Linux. Получение списка файлов по маске с игнорированием регистра символов имени файла.

Преамбула

Всем известна команда ls, выводящая список файлов на консоль. Если требуется вывести только файлы с расширением .iso, то в команду подставляется маска файла: ls *.iso
И все бы хорошо, но команда ls, как и другие команды Linux, любит строгое совпадение регистра имен файлов, т.е. если в каталоге есть файлы с расширением .ISO, .Iso и .iso, то ls *.iso выдаст только те, которые с расширением именно что .iso, и проигнорирует остальные. А вот Windows регистр имен файлов глубоко пофиг, хотя, современные версии Windows и сохраняют регистр в имени файлов. Но для аналогичной линуксовой команде ls команды Windows dir, что .ISO, что .Iso, что .iso — равнозначны, и все командой dir *.iso будут выведены.

Чем воспользоваться?

Можно воспользоваться мощной командой find, которая умеет игнорировать регистр имен файлов (на самом деле, она кучу всего умеет, см. в источниках):

find <path> -maxdepth 1 -iname <mask>

где:
<path> — путь к каталогу, в котором производится поиск.
-maxdepth 1 — глубина поиска 1 — только в текущем каталоге, без параметра -maxdepth — во всех подкаталогах и ниже.
-iname — игнорировать регистр имени файла.
<mask> — маска файла

Чтобы обрезать полный путь (а find выдает полный путь к файлу(-ам)) до имени, можно воспользоваться командой

basename <path>

где

<path> — полный путь к файлу

Объединить работу двух команд можно с помощью цикла for

Решение

Создадим отдельную функцию create_list(), принимающую два параметра — путь к каталогу и маску файла, и выдающую список файлов в переменную $FOUNDLST:

create_list() #$1 - dir, $2 - file mask
{
    FOUNDLST=""
    for FLE in $(find $1 -maxdepth 1 -iname $2); do
	if [ -n "$FLE" ]; then
	    FOUNDLST="$FOUNDLST"`basename $FLE`"\n"
	fi
    done
}

Пример использования функции

DIR1="/home/smallwolfie/test/archives"
DIR2="/home/smallwolfie/test/isos"
...
create_list $DIR1 "*.tar.gz"

if [ -z "$FOUNDLST" ]; then
    echo "$DIR1 *.tar.gz not found"
else
    TARGZ=$FOUNDLST
fi

create_list $DIR2 "*.iso"

if [ -z "$FOUNDLST" ]; then
    echo "$DIR2 *.iso not found"
else
    ISO=$FOUNDLST
fi

create_list $DIR2 "*.zip"

if [ -z "$FOUNDLST" ]; then
    echo "$DIR2 *.zip not found"
fi

echo "*.tar.gz:"
echo -e -n "$TARGZ"
echo "-----------"
echo "*.iso:"
echo -e -n "$ISO"

Результат

Ясно, что в тестовой директории archives должны лежать архивы *.tar.gz, а в isos — образы *.iso

/home/smallwolfie/test/archives *.zip not found
*.tar.gz:
one.tar.gz
two.tar.gz
teSt.Tar.gZ
TEST.TAR.GZ
-----------
*.iso:
lamantin.iso
ariar-01-05-2019-install.ISO
smallwolfie@wolfschanze:~/test$

Готовый скрипт

На GitHub
На PasteBin

Источники

1. Команда find в Linux Копия
2. basename
3. Цикл for в bash

Рассказывают тут про работу в «Мираторге».

Суть в чем, контора ищет себе рабочих в других регионах, объявления о работе веерно раскидываются по всевозможным сайтам, а потом вдруг получается что-то такое:

Мираторг, это хорошо разрекламированная организация. По телефону обещают 3-х разовое питание. На самом деле, один обед

Обещают бабло, но не факт, что ты попадешь на трактор и хорошо оплачиваемые работы. На учебу ты поедешь, за свой счет.

Домой попадешь в октябре. Если попадешь на трактор и через месяц захочешь домой, тебе найдут подмену, но обратно на трактор не сядешь. Там на Маниту, один работает 5 месяцев, за 30.

Жилье общага

Ты будешь приходить туда, только спать. Работа сутки, через сутки. За сутки два часа на сон, с 3 до 5. [Хотя трактористу, водителю нельзя работать более 8 часов, прим. ред.] Дольше работа двигателя на холостом ходу, считается пережог. Соответственно штраф за соляру.

Сможешь сутки, через сутки? Работаешь в поле, привозят обед и ужин. Хорошо, если работает кондей, а так ужин скисает. Один работяга, поработал в том году, потом прошел курс лечения желудка, за 40 с копейками. Теперь на таблетках.

Я поехал с напарником, он отдал чистую трудовую, чтобы не заморачиваться с увольнением. Его хватило с 29 марта до 6 апреля. 11 апреля мне оплатили 8599 руб. за 5 дней на базе по 8 часов, по наряду и 2 дня на ферме по путёвкам, по 10 и 11 часов.

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

Моя жена сказала: лучше дома за 30,чем там за обещанные «миллионы». Нам также сказали: куда вас х.. принес? Что ближе, работы нет?

Обидно, только что со службы занятости снялся, из-за этой помойки

Это вот из личной переписки.

Еще ссылка по теме

Мираторг, мы наябываем людей!

Прикольно, ГОРФ же.