Используйте bash, чтобы найти первое имя папки, содержащее строку Я хотел бы сделать это в Bash: в текущем каталоге найдите первую папку, содержащую "foo" в имени Я играл с командой find, но немного смутился. Любые предложения? Ответ 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)
Ответ 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)