web-dev-qa-db-ja.com

bashを使用して、文字列を含む最初のフォルダー名を見つけます

私はこれをBashでやりたい:

  • 現在のディレクトリで、名前に「foo」を含む最初のフォルダを見つけます

私はfindコマンドで遊んでいますが、少し混乱しています。助言がありますか?

55
dylanized

find-quitオプションを使用できます。

find <dir> -maxdepth 1 -type d -name '*foo*' -print -quit
86
hek2mgl
pattern="foo"
for _dir in *"${pattern}"*; do
    [ -d "${_dir}" ] && dir="${_dir}" && break
done
echo "${dir}"

これは、提供されている他のシェルソリューションよりも優れています。

  • パターンはグロブの一部であり、ループ内でチェックされないため、巨大なディレクトリの場合は高速になります
  • 実際にパターンに一致するディレクトリがない場合は期待どおりに動作します(${dir}は空になります)
  • =~演算子に依存しないため、POSIX準拠のシェルで動作します(必要な場合はパターンによって異なります)
  • 名前に改行を含むディレクトリに対して機能します(vs. find
10

例えば:

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

または(より良いシェルソリューションについては、AdrianFrü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コメントに基づいて編集されたhead -n1

@chepnerのコメントに基づく次

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

または

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