Подтвердить что ты не робот

Используйте bash, чтобы найти первое имя папки, содержащее строку

Я хотел бы сделать это в Bash:

  • в текущем каталоге найдите первую папку, содержащую "foo" в имени

Я играл с командой find, но немного смутился. Любые предложения?

4b9b3361

Ответ 1

Вы можете использовать опцию -quit для find:

find <dir> -maxdepth 1 -type d -name '*foo*' -print -quit

Ответ 2

pattern="foo"
for _dir in *"${pattern}"*; do
    [ -d "${_dir}" ] && dir="${_dir}" && break
done
echo "${dir}"

Это лучше, чем другое решение оболочки, потому что

  • он будет быстрее для огромных каталогов, поскольку шаблон является частью glob и не проверяется внутри цикла
  • работает, как и ожидалось, когда нет каталога, соответствующего вашему шаблону (тогда ${dir} будет пустым)
  • он будет работать в любой POSIX-совместимой оболочке, поскольку он не полагается на оператор =~ (если вам это нужно, это зависит от вашего шаблона)
  • он будет работать для каталогов, содержащих новые строки в их имени (vs. find)

Ответ 3

например:

dir1=$(find . -name \*foo\* -type d -maxdepth 1 -print | head -n1)
echo "$dir1"

или (Для лучшего решения оболочки см. ответ Адриана Фрюхвирта)

for dir1 in *
do
    [[ -d "$dir1" && "$dir1" =~ foo ]] && break
    dir1=        #fix based on comment
done
echo "$dir1"

или

dir1=$(find . -type d -maxdepth 1 -print | grep 'foo' | head -n1)
echo "$dir1"

Отредактированный заголовок -n1 на основе комментария @hek2mgl

Далее на основе комментариев @chepner

dir1=$(find . -type d -maxdepth 1 -print | grep -m1 'foo')

или

dir1=$(find . -name \*foo\* -type d -maxdepth 1 -print -quit)