Не зацикливайте вывод find
, вместо этого используйте find
для выполнения скрипта, который вы передаете с путями:
#!/bin/bash
topdir='/search/path'
pattern='FOO[0-9][0-9]_(bar|dog|cat)'
find "$topdir" -type f -maxdepth 1 -iname '*.doc' -exec bash -c '
pattern=$1; shift
for pathname do
stem=$( basename "${pathname%.*}" )
if [[ "$stem" =~ $pattern ]]; then
printf "Found %s\n" "$pathname"
else
printf "No match in %s\n" "$pathname"
fi
done' bash "$pattern" {} +
Обратите внимание, что использование -iname
с find
приводит к совпадению имени файла без учета регистра.
Связанные:
Или проще, используяbash
:
#!/bin/bash
topdir='/search/path'
pattern='FOO[0-9][0-9]_(bar|dog|cat)'
shopt -s globstar nullglob
for pathname in "$topdir"/**/*.[Dd][Oo][Cc]; do
stem=$( basename "${pathname%.*}" )
if [[ "$stem" =~ $pattern ]]; then
printf "Found %s\n" "$pathname"
else
printf "No match in %s\n" "$pathname"
fi
done
Или, используя универсальные имена файлов повсюду:
#!/bin/bash
topdir='/search/path'
shopt -s globstar nullglob extglob
for pathname in "$topdir"/**/*FOO[0-9][0-9]_@(bar|dog|cat)*.[Dd][Oo][Cc]
do
printf "Found %s\n" "$pathname"
done
globstar
включает шаблон глобуса **
, который работает аналогично *
, но совпадает по косой черте в именах путей. nullglob
заставляет несопоставленные шаблоны подстановок расширяться до пустой строки. extglob
делает доступными несколько расширенных шаблонов шаров. Среди них @(...)
, который соответствует любому из шаблонов в скобках. Для одного вкладыша -можно использовать
.shopt -s globstar nullglob extglob; printf 'Found %s\n' "$topdir"/**/*FOO[0-9][0-9]_@(bar|dog|cat)*.[Dd][Oo][Cc]
, но это по-прежнему будет печатать только строкуFound
(в строке ), если совпадений не найдено.