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
, sed
ou awk
va é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
, grep
et 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 dirname
place 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 -5
pour 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 time
pour 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
uniq
utile 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