Поиск файлов с указанными пользователем расширениями

Вы задали этот вопрос дважды, но я повторю свой ответ. Вmain.cf:

myorigin = $mydomain
1
29.09.2019, 15:01
2 ответа

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

#!/bin/sh

for suffix do
    set -- "$@" -o -iname "*.$suffix"
    shift
done

shift

find. -type f \( "$@" \)

Этот скрипт будет называться

./script.sh ksh cfg

и заменит каждый суффикс $suffixв позиционных параметрах на -o -iname "*.$suffix".

Единственный shiftперед вызовом findудаляет начальный -oв "$@".

Использование массивов в ksh93илиbash:

#!/bin/ksh

name_opts=()

for suffix do
    name_opts+=( -o -iname "*.$suffix" )
done

find. -type f \( "${name_opts[@]:1}" \)

:1в "${name_opts[@]:1}"отбрасывает первый элемент массива name_opts(начального-o).


Если вы действительно хотите получить суффиксы в виде строки -с разделителями-запятыми (, что означает, что вы не можете использовать сценарий для поиска файлов с запятыми в суффиксах имен файлов, таких как файлы в хранилище RCS или CVS. ), вы можете преобразовать эту строку $listв массив в bashили ksh93с

set -f
suffixes=( ${list//,/ } )
set +f

или в shс

set -f
set -- $( printf '%s\n' "$list" | tr ',' ' ' )
set +f

или

set -f; ifs=$IFS; IFS=','
set -- $list
set +f; IFS=$ifs; unset ifs

(они устанавливают позиционные параметры в список суффиксов ).

set -fотключает генерацию имени файла (подстановку ), так как мы полагаемся на оболочку для разделения строки на пробелы, которыми мы заменяем запятые, но чтобы не использовать сгенерированный слова для globbing. Без set -fмы не смогли бы правильно обработать запрос суффиксов, таких как [ch]или *.

Цикл в bashили kshизменится с

for suffix do...

-

for suffix in "${suffixes[@]}"; do...

, а петля в shостанется как есть.

1
27.01.2020, 23:30

Вы можете использовать -iregexвместо нескольких -inames. например.использование расширенных регулярных выражений:

ГНУfind:

find. -type f -regextype egrep -iregex '.*\.(ksh|cfg)$'

FreeBSDfind:

find -E . -type f -iregex '.*\.(ksh|cfg)$' 

Если у вас уже есть запятая расширения -, разделенная в переменной (, например. $csep), преобразуйте их в чередование регулярных выражений(|). первый. например

csep='ksh,sh,cfg,csv'
re="$(echo "$csep" | tr, '|')"
find. -type f -regextype egrep -iregex ".*\.($re)$"
#BSD: find -E. -type f -iregex ".*\.($re)$"

Если вам необходимо поддерживать расширения с запятыми в них, вы можете использовать sedвместо tr, чтобы разрешить обратную косую черту -экранированные запятые(\,). например.

$ csep='ksh,sh,cfg,csv,c\,v'
$ re="$(echo "$csep" | sed -Ee 's/([^\]),/\1|/g')"
$ printf '%b\n' "$re"
ksh|sh|cfg|csv|c\,v
0
27.01.2020, 23:30

Теги

Похожие вопросы