LINUX.ORG.RU

find исключить файлы из поиска

 ,


0

1

Всем привет! Есть такой кусок скрипта, который проходит по папкам и вычисляет контрольные суммы для файлов. Нужно сделать так, чтобы в шаблоне(TEMPLATE) можно было указать типы файлов, которые нужно исключить из поиска. Если этот шаблон состоит из одного типа файла, то все работает. Если два типа и больше, то начинаются проблемы: для первого значения в TEMPLATE скрипт проходит по файлам, исключая 1-ый тип файлов, но учитывая 2-ой тип. Когда скрипт проходит по второму значению в TEMPLATE, то наоборот 2-ой тип исключается, а 1-ый учитывается. Подскажите как сделать, чтобы оба типа исключались? Заранее спасибо.

#!/bin/bash
DIR=('/home/user/Downloads/')
TEMPLATE=( '*.deb' '*.save' )
tempfile=$(/bin/mktemp)
file=$(/bin/mktemp)
for j in ${DIR[*]}
do
        for i in ${TEMPLATE[*]}
        do
                command="find ${j} -type f -not -name ${i} -exec md5sum {} + >> ${tempfile}"
                bash -c "${command}"
        done
done

Можно сделать комплексное условие из -not-name'ов, используя find'овский оператор -and (подробнее в man find). (оказывается, без -and тоже прокатит, он неявно продразумевается).

Но проще будет сначала получить список всех файлов, отфильтровать его от ненужных имён и в цикле запускать md5sum.

E ★★★
()
Последнее исправление: E (всего исправлений: 1)
Ответ на: комментарий от E

сделать комплексное условие из -not-name'ов, используя find'овский оператор -and

идея понятна и работает, если задать явно, например, так:

find /home/user/Downloads/ -type f -not -name *.deb -not -name *.save 
Но как сделать, чтобы работало через переменную TEMPLATE? Т.е. чтобы блок [-not -name *.(расширение)], повторялся столько раз сколько расширений, а расширение каждый раз подставлялось новое? P.S. вопрос возможно тупой, но в баше плохо разбираюсь.

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

Проверить нет возможности, но, думаю, смысл поймешь.

#!/bin/bash
DIR=('/home/user/Downloads/')
TEMPLATE=( '*.deb' '*.save' )
tempfile=$(/bin/mktemp)
file=$(/bin/mktemp)

excl=""
for i in ${TEMPLATE[*]}
do
  [[ -n $excl ]] && excl="${excl} -and"
  excl="{$excl} -not -name ${i}"
done

for j in ${DIR[*]}
do
  command="find ${j} -type f ${excl} -exec md5sum {} + >> ${tempfile}"
  bash -c "${command}"
done

P. S. Может "-and" не нужно

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Kroz

Предлагаю такой вариант:

#!/bin/bash

DIR=( '/home/user/Downloads/' )
TEMPLATE=( '*.deb' '*.save' )

unset excl
for pattern in "${TEMPLATE[@]}"; do
  excl="$excl -o -name '$pattern'"
done

echo "-type f ! ( -false $excl ) -exec md5sum {} +" | \
  xargs find "${DIR[@]}" > $tempfile
unterwulf
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.