LINUX.ORG.RU

Передача find нескольких масок для поиска


0

2

Доброго времени суток, о коллективный разум.

Пишу скрипт. Часть скрипта ищет в каталоге и ниже файлы по заданной маске. Собственно, выглядит это примерно так:

IFS=$'\n'
(
  cd "$DIR"
  for FILE in $(find -type f -name "${MASK}" -printf '%f\n')
  do
    echo "        $FILE"
#   PAYLOAD
  done
)

Собственно, вопрос - что должно быть в переменной $MASK, чтобы искались, к примеру, все файлы *.bz2 и *.xz?

Перемещено beastie из talks

★★

man find

expr1 -o expr2
Or; expr2 is not evaluated if expr1 is true.

schizoid ★★★
()

через переменную не получится - find не умеет условия в них
а должно быть примерно так

ls
00-skeptiks-cobwebs-(nsdx011)-web-2011.jpg  00-skeptiks-cobwebs-(nsdx011)-web-2011.sfv  02-skeptiks-under_the_bed.mp3
00-skeptiks-cobwebs-(nsdx011)-web-2011.nfo  01-skeptiks-cobwebs.mp3
find . -type f \( -name "*.mp3" -o -name "*.jpg" \)
./02-skeptiks-under_the_bed.mp3
./01-skeptiks-cobwebs.mp3
./00-skeptiks-cobwebs-(nsdx011)-web-2011.jpg

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

find умеет регэкспы

 % find . -maxdepth 1 -type f -regex ".*\(mp3\|jpg\)$"
./01-skeptiks-cobwebs.mp3
./00-skeptiks-cobwebs-(nsdx011)-web-2011.jpg
./02-skeptiks-under_the_bed.mp3
 % 
dGhost ★★★
()
Ответ на: комментарий от megabaks

все работает, просто нужно немного магии

 % set -f
 % test=".*\(mp3\|jpg\)$"
 % find . -maxdepth 1 -type f -regex $test
./01-skeptiks-cobwebs.mp3
./00-skeptiks-cobwebs-(nsdx011)-web-2011.jpg
./02-skeptiks-under_the_bed.mp3
 % 

dGhost ★★★
()

ищет в каталоге и ниже

рекурсивный глоббинг спасёт отца русской демократии

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

Да, оно. Чёрт, я сломал мозг на тему того, почему не работает эта конструкция без лидирующей точки, пока не нашёл определение классических регулярок. Всё время забываю, что * в шаблонах оболочки и в регулярках - не одно и то же.

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

рекурсивный глоббинг спасёт отца русской демократии

К нему в довесок идёт какой-то другой шелл, мне с довесками не надо.

cache ★★
() автор топика

schizoid, megabaks, dGhost - благодарю за готовность помочь. Вы натолкнули меня на решение проблемы. Результирующее преобразование позволяет получить на входе список масок через пробел и выглядит так:

MASK=`echo "$MASK" | sed -e 's/\./\\\./g;s/*/.*/g;s/\s\+/ /g;s/\s/\\\|/g'`

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

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