LINUX.ORG.RU

Автогенерация имен файлов в SHELL

 ,


3

2

Добрый день. Известно что SHELL поддерживает автогенерацию имен файлов и команды типа

cat *.txt

отлично работают. Очень хочется узнать про эту магию больше, в частности интересует вопрос что значят спецсимволы ^,! и {} в контексте автогенерации.

И главный вопрос как средствами этой самой генерации вывести содержимое каталогов (ls), имена которых состоят только из трех символов?

Посоветуйте книжку или ман, где это описано )

P.S. ибо студент, хочу сдать лабу (гугл подводит с этим вопросом)


вывести содержимое каталогов (ls), имена которых состоят только из трех символов

for f in /????; do echo $f; done

? — это маска, как и *, но ? означает одну букву.

{}

тут дофига что можно сделать, замену, удаление участка, использовать массивы...

а генерируются циферки например, echo ${1..20}

Spoofing ★★★★★
()

допустим, хочешь ты посмотреть только с 5 по 7 серию сериала.

# mplayer TV_Series.s01.e{05..07}*.avi
Spoofing ★★★★★
()

Очень хочется узнать про эту магию больше

пиши что-нибудь простое на баше. только на собственном опыте поймешь что и как работает.

вот пример реализации XMPP-бота на чистом bash: http://spfng.com/~spoofing/xmpp.sh

начни например, со скрипта который автоматизирует процесс создания бекапов и заливки их куда-нибудь... на самом деле тут всего две-три команды, но обери это в красивый bash-скрипт.

ощщем, ничего сложного. bash для дураков.

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

for f in /????; do echo $f; done

Спасибо, блин я совсем забыл про "?" ls ??? решает проблему

# mplayer TV_Series.s01.e{05..07}*.avi

{05..07} ага, значит фигурные скобки генерируют промежуток, видимо и не только

Знаю что «^» нужна для отрицания символов в группе [^abc], типа все символы кроме abc

Однако "!" остается загадкой для чего он? Может быть для отрицания одного символа?

пиши что-нибудь простое на баше. только на собственном опыте поймешь что и как работает.
вот пример реализации XMPP-бота на чистом bash: http://spfng.com/~spoofing/xmpp.sh

Спасибо большое!

ntstv
() автор топика

Это не автогенерация, это соответствие регулярным выражением. В bash оно обрезано, но для 80% случаев хватает

* - в bash - (не-квантификатор) один или более символов. В нормальных регулярках регулярках - это квантификатор означающий «ноль или более символов». Например, в bash 'a*c' поймает то, что начинается с 'a', потом ноль или более любых символов, и оканчивается на 'c', тогда как в нормальных регулярках оно должно поймать то, что имеет вначале ноль или более 'a' после и оканчивается на 'c'.

? - в bash - (не-квантификатор) один любой символ. В нормальных регулярках - квантификатор «ноль или один символ». Например, в bash a?c поймает 'abc', 'aac', 'azc', но не поймает 'ac' и 'c', в нормальных регулярках оно поймает только 'ac' и 'c' (то есть «ноль или один 'a' и потом 'c'»).

[XYZ] или [X-Z] - один символ из перечисленного диапазона или множества (явное перечисление или диапазон). Например [a-zA-Z].

[^XYZ] или [!XYZ] - один символ НЕ из перечисленного диапазона

Строго говоря, по регуляркам в bash это всё.

Используется чаще для параметров командной строки (ls *.txt), как часть цикла for (for FILE in *.txt ; do echo "$FILE" ; done), в манипуляциях со значениями переменных в bash (A="filename.txt" ; echo "${A##*.}" - удалить самое длинное совпадение по регулярке '*.' начиная сначала - то есть покажет расширение файла).

Еще есть фигурные скобки {str1,str2,str3} . Они раскрываются подставляя по очереди каждое значение разделенное запятыми. Например, echo str{1,2,3} выведет str1, str2, str3. Ну, или диапазон: echo str{1..5}.

Важно помнить одну деталь: это всё раскрывается ДО передачи их скрипту. Проверить просто:

$ test(){ echo $#;} # Выводит количество аргументов
$ test a*
5
То есть функции test передалось 5 аргументов, при условии что у тебя 5 файлов, имя которых начинается на 'a'.

Это иногда удобно, например, для такого:

$ cp file.ext{,bak} # Сделать копию файла

Но иногда доставляет неудобства. Например, вот что считается багом bash by design:

$ touch file
$ ls *
file
$ touch ./-la
$ ls *
-rw-r--r-- 1 user user 0 may  4 11:01 file
$ rm './-la'
То есть оно раскрыло регулярку перед передачей параметров ls , а поскольку там есть файл, который начинается с дефиса, ls воспринял его как параметр.

Здесь генерацией может считаться разве что {}. А для нормальной генерацией я бы назвал функцию mktemp, которая создает в каталоге /tmp (по умолчанию) уникальный файл и выводи его имя на экран.

А почитать лучше здесь: http://www.opennet.ru/docs/RUS/bash_scripting_guide/ . Хотя именно по регуляркам там мало.

Hope this helps.

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