Gebruik bash naar de eerste map naam die een string

Ik wil graag om dit te doen in Bash:

  • in de huidige map, op zoek naar de eerste map die “foo” bevat in de naam

Ik speel rond met het find commando, maar een beetje in de war. Eventuele suggesties?


Antwoord 1, Autoriteit 100%

U kunt de -quitmogelijkheid find

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

Antwoord 2, gezag 13%

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

Dit is beter dan de andere schaal verschafte oplossing omdat

  • het zal sneller voor grote mappen als het patroon is een onderdeel van de glob en niet gecontroleerd in de lus
  • echt werkt zoals verwacht wanneer er geen directory aan uw patroon (toen ${dir}zal leeg zijn)
  • het zal werken in een POSIX-compliant shell omdat het niet vertrouwen op de =~operator (als je dit is afhankelijk van uw patroon)
  • het zal werken voor u mappen met nieuwe regels in hun naam (vs. find)

Antwoord 3, Autoriteit 10%

bijvoorbeeld:

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

of (Voor de betere shell oplossing zie antwoord Adrian Frühwirth’s)

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

of

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

Edited hoofd -n1 gebaseerd op @ hek2mgl commentaar

Volgende gebaseerd op reacties @ chepner’s

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

of

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

Other episodes