web-dev-qa-db-fra.com

Utilisez bash pour trouver le premier nom de dossier contenant une chaîne

J'aimerais faire ceci dans Bash:

  • dans le répertoire en cours, recherchez le premier dossier contenant "foo" dans le nom

J'ai joué avec la commande find, mais un peu confus. Aucune suggestion?

55
dylanized

Vous pouvez utiliser le -quit option de find:

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}"

C’est mieux que l’autre solution Shell fournie car

  • ce sera plus rapide pour les gros répertoires car le motif fait partie du glob et n'est pas vérifié à l'intérieur de la boucle
  • fonctionne comme prévu quand aucun répertoire ne correspond à votre modèle (alors ${dir} sera vide)
  • cela fonctionnera dans n'importe quel shell compatible POSIX puisqu'il ne s'appuie pas sur le =~ _ opérateur (si vous en avez besoin, cela dépend de votre modèle)
  • cela fonctionnera pour les répertoires contenant des nouvelles lignes dans leur nom (vs find)
10

par exemple:

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

ou (Pour la meilleure solution Shell, voir la réponse d'Adrian Frühwirth)

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

ou

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

Edited head -n1 basé sur le commentaire @ hek2mgl

Suivant basé sur les commentaires de @ chepner

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

ou

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