Один лайнер, соответствующий именам файлов с регулярными выражениями?

Запустите команду cp с аргументом -v в xterm.

3
16.11.2018, 02:20
1 ответ

Не зацикливайте вывод 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(в строке ), если совпадений не найдено.

0
27.01.2020, 21:30

Теги

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