Il existe essentiellement 2 méthodes que vous pouvez utiliser pour cela. L'un analysera la chaîne pendant que l'autre opèrera sur chaque fichier. L'analyse de la chaîne utilise un outil tel que grep, sedou awkva évidemment être plus rapide, mais voici un exemple montrant les deux, ainsi que la manière dont vous pouvez "profiler" les 2 méthodes.
Échantillon de données
Pour les exemples ci-dessous, nous utiliserons les données suivantes
$ touch dir{1..3}/dir{100..112}/file{1..5}
$ touch dir{1..3}/dir{100..112}/nile{1..5}
$ touch dir{1..3}/dir{100..112}/knife{1..5}
Supprimer certains des *f*fichiers de dir1/*:
$ rm dir1/dir10{0..2}/*f*
Approche n ° 1 - Analyser via des chaînes
Ici , nous allons utiliser les outils suivants, find, grepet sort.
$ find . -type f -name '*f*' | grep -o "\(.*\)/" | sort -u | head -5
./dir1/dir103/
./dir1/dir104/
./dir1/dir105/
./dir1/dir106/
./dir1/dir107/
Approche n ° 2 - Analyser à l'aide de fichiers
Même chaîne d'outils qu'avant, sauf que cette fois, nous utiliserons la dirnameplace de grep.
$ find . -type f -name '*f*' -exec dirname {} \; | sort -u | head -5
./dir1/dir103
./dir1/dir104
./dir1/dir105
./dir1/dir106
./dir1/dir107
Remarque: les exemples ci-dessus sont utilisés head -5pour limiter simplement la quantité de sortie que nous traitons pour ces exemples. Ils seraient normalement supprimés pour obtenir votre liste complète!
Comparer les résultats
Nous pouvons utiliser timepour regarder les 2 approches.
nom de répertoire
real        0m0.372s
user        0m0.028s
sys         0m0.106s
grep
real        0m0.012s
user        0m0.009s
sys         0m0.007s
Il est donc toujours préférable de manipuler les chaînes si possible.
Méthodes alternatives d'analyse de chaînes
grep & PCRE
$ find . -type f -name '*f*' | grep  -oP '^.*(?=/)' | sort -u
sed
$ find . -type f -name '*f*' | sed 's#/[^/]*$##' | sort -u
awk
$ find . -type f -name '*f*' | awk -F'/[^/]*$' '{print $1}' | sort -u
               
              
uniqutile d’y ajouter des éléments en supprimant les lignes répétées qui sont déjà juxtaposées.find . -type f -name '*f*' -printf '%h\0' | uniq -z | sort -zu | tr '\0' '\n'. Ou si vos outils sont un peu plus anciens, uniq peut ne pas avoir l'option -z.find . -type f -name '*f*' -printf '%h\n' | uniq | sort -u