sort - Comment trier les résultats de find(y compris les répertoires imbriqués) par ordre alphabétique dans bash




sort shell (2)

J'ai une liste de répertoires basés sur les résultats de l'exécution de la commande "find" dans bash. A titre d'exemple, les résultats de find sont les fichiers:

test/a/file
test/b/file
test/file
test/z/file

Je veux trier la sortie afin qu'elle apparaisse comme:

test/file
test/a/file
test/b/file
test/z/file

Est-il possible de trier les résultats dans la commande find, ou en redirigeant les résultats dans le tri?


Si vous avez la version GNU de find, essayez ceci:

find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}'

Pour utiliser ces noms de fichiers dans une boucle, faites

find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}' | while read file; do
    # use $file
done

La commande find imprime trois choses pour chaque fichier: (1) son répertoire, (2) sa profondeur dans l'arborescence, et (3) son nom complet. En incluant la profondeur dans la sortie, nous pouvons utiliser sort -n pour trier test/file au-dessus de test/a/file . Finalement, nous utilisons awk pour enlever les deux premières colonnes puisqu'elles ne servaient qu'au tri.

L'utilisation de \0 comme séparateur entre les trois champs nous permet de gérer les noms de fichiers avec des espaces et des tabulations (mais pas de sauts de ligne, malheureusement).

$ find test -type f
test/b/file
test/a/file
test/file
test/z/file
$ find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F'\0' '{print $3}'
test/file
test/a/file
test/b/file
test/z/file

Si vous ne parvenez pas à modifier la commande find , essayez ce remplacement compliqué:

find test -type f | while read file; do
    printf '%s\0%s\0%s\n' "${file%/*}" "$(tr -dc / <<< "$file")" "$file"
done | sort -t '\0' | awk -F'\0' '{print $3}'

Il fait la même chose, avec ${file%/*} étant utilisé pour obtenir le nom du répertoire d'un fichier et la commande tr utilisée pour compter le nombre de barres obliques, ce qui équivaut à la "profondeur" d'un fichier.

(J'espère que vous trouverez une réponse plus facile, ce que vous demandez ne semble pas si difficile, mais je suis en train de supprimer une solution simple.)


essaye ça. à titre de référence, il fait d'abord des tris sur le deuxième champ second char. qui n'existe que sur le fichier, et qui a le sens inverse, c'est le premier, après quoi il va trier sur le premier caractère du deuxième champ. [-t est le suppresseur de champ, -k est la clé]

find test -name file |sort -t'/' -k2.2r -k2.1

faire un info sort pour plus d'informations. il y a une tonne de façons différentes d'utiliser les -t et -k ensemble pour obtenir des résultats différents.





find