Предполагая, что вы получаете суффиксы имен файлов в качестве отдельных аргументов командной строки (см. конец ответа, как работать со строкой, разделенной запятыми -):
#!/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
останется как есть.
Gnu sed может сделать следующее:
sed -ns '
/^Dipole Moment: \[D]/!d
$!N;/\n/s/.* //p;:n;n;bn
'./*.txt
-s
опция (nonPosix )для обработки файлов как отдельных потоков. -n
запрещает печать пространства шаблонов по умолчанию перед выборкой следующей записи.