Je parcours des dossiers et je trouve les dossiers qui ont une extension de fichier spécifique. Sur la base du résultat de la recherche, j'obtiens le chemin du répertoire sous la forme -
Par exemple
./Config/SysMapping.txt
./Config/exclusion_list_old.txt
Je veux simplement obtenir le nom:
Configuration
et supprimer
./
avant
Configuration
et tout après Config, c'est-à-dire
/SysMapping.txt
3 Réponses :
dirname
supprimerait le fichier à la fin de votre chemin. Dans votre exemple, vous vous retrouveriez avec ./Config
. Vous pouvez ensuite diriger ceci vers awk '{gsub (/^\.\//, ""); print} '
pour supprimer le ./
.
Cela extraira le premier élément de chemin après ./
et supprimera les doublons:
P=./Config/SysMapping.txt P=${P%/*} # --> ./Config P=${P#./} # --> Config echo "$P"
Dans bash, vous pouvez faire:
echo ./Config/SysMapping.txt | awk -F/ '{print $2}' | sort -u
Cela a parfaitement fonctionné pour moi. J'ai pu faire ce que je voulais faire. Merci beaucoup.
Vous pouvez utiliser le paramètre globstar
:
shopt -s globstar nullglob files=(**/*.txt) # if there cannot be newlines in filenames printf '%s\n' "${files[@]%/*}" | sort -u # if there can be newlines in filenames printf '%s\0' "${files[@]%/*}" | sort -zu | tr '\0' '\n'
Le tr
est là juste pour imprimer les noms de répertoire joliment à la fin. Vous pouvez choisir de traiter différemment les noms de répertoires délimités par null, avec une boucle while
par exemple.
Dirname fait-il tout pour vous?
Oui dirname fait tout pour moi