developer tip

bash를 사용하여 문자열이 포함 된 첫 번째 폴더 이름 찾기

optionbox 2021. 1. 7. 07:54
반응형

bash를 사용하여 문자열이 포함 된 첫 번째 폴더 이름 찾기


나는 Bash에서 이것을하고 싶습니다.

  • 현재 디렉토리에서 이름에 "foo"가 포함 된 첫 번째 폴더를 찾습니다.

나는 find 명령을 가지고 놀았지만 약간 혼란 스럽습니다. 어떤 제안?


다음 -quit옵션을 사용할 수 있습니다 find.

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

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

제공된 다른 쉘 솔루션보다 낫습니다.

  • 패턴이 glob의 일부이고 루프 내부에서 확인되지 않으므로 거대한 디렉토리의 경우 더 빠릅니다.
  • 패턴과 일치하는 디렉토리가 없을 때 실제로 예상대로 작동합니다 ( ${dir}비어 있음).
  • =~운영자에 의존하지 않기 때문에 POSIX 호환 쉘에서 작동합니다 (필요한 경우 패턴에 따라 다름)
  • 이름에 줄 바꿈이 포함 된 디렉토리에서 작동합니다 (vs. find).

예를 들면 :

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

또는 (더 나은 쉘 솔루션은 Adrian Frühwirth의 답변을 참조하십시오)

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"

@ hek2mgl 주석을 기반으로 헤드 -n1 편집

다음은 @chepner의 의견에 따라

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

또는

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

참조 URL : https://stackoverflow.com/questions/16344365/use-bash-to-find-first-folder-name-that-contains-a-string

반응형