ordre de tri par défaut de la commande find

30

quel est l'ordre de tri par défaut pour les entrées renvoyées par la commande linux find?

Par exemple, si j'émets

find . -type f -name '*mp3' 

et la sortie se compose de plusieurs fichiers dans plusieurs sous-dossiers, quel est l'ordre par défaut dans lequel les répertoires sont répertoriés? Dans le même temps, quel est l'ordre de tri dans lequel les fichiers d'un répertoire individuel sont répertoriés?

Parfois, il revient:

./B/01.mp3
./A/01.mp3
./A/04.mp3
./A/02.mp3

Voyez comment le contenu du répertoire B est d'abord répertorié, puis celui du répertoire A. En même temps, dans le répertoire A, les fichiers sont répertoriés dans un ordre amusant.

Nasko
la source
D'après l'expérience, il semble être cohérent par installation, c'est-à-dire. si vous avez le même ensemble de fichiers sur deux machines, il retournera toujours une commande sur une machine et une complètement différente sur l'autre. Je me suis demandé pourquoi auparavant, +1
James L
1
J'ai un émetteur FM dans ma voiture et il lit toujours les chansons de ma carte flash dans un ordre étrange. Je ne l'ai jamais compris, mais j'ai reconnu que c'était exactement le même ordre dans lequel la commande ci-dessus a renvoyé sa sortie
Nasko
BTW: BSD find a un -sparamètre pour trier alphabétiquement la sortie.
lapo

Réponses:

19

findtraversera l'arborescence du répertoire dans l'ordre où les éléments sont stockés dans les entrées du répertoire. Cela sera (principalement) cohérent d'une exécution à l'autre, sur la même machine et sera essentiellement "ordre de création de fichier / répertoire" s'il n'y a pas eu de suppression.

Cependant, certains systèmes de fichiers réorganisent les entrées de répertoire dans le cadre des opérations de compactage ou lorsque la taille de l'entrée doit être augmentée, il y a donc toujours une petite chance que l'ordre "brut" change avec le temps. Si vous souhaitez un ordre cohérent, alimentez la sortie à travers une étape de tri supplémentaire.

Vatine
la source
Merci pour votre réponse détaillée! Donc, si mon émetteur FM (voir mon commentaire précédent) lit les pistes dans l'ordre où la commande find les listerait, je ne suis pas en mesure de contrôler dans quel ordre je voudrais qu'elles soient lues.
Nasko
Eh bien, la carte flash utilise probablement un système de fichiers FAT et si je me souviens bien, la manipulation de l'ordre des entrées FAT est assez facile avec un débogueur de système de fichiers. Il peut être utile de copier les chansons du flash actuel sur un nouveau flash, dans l'ordre dans lequel vous souhaitez les lire, cela peut être plus facile.
Vatine
L'une des applications utiles d'une telle cohérence est une estimation de la progression de lent find /path/ -exec ...avec un fonctionnement beaucoup plus rapide find /path/pour obtenir la liste triée des fichiers en premier.
Andrey
6

Vous ne devez pas vous fier à un ordre de sortie particulier findet utiliser plutôt d' sortautres moyens pour contrôler spécifiquement l'ordre.

En pause jusqu'à nouvel ordre.
la source
2

Je travaille sous UNIX / Linux depuis 1984/1991 respectivement et la première commande qui m'a été enseignée a été find. Linux / GNU a mis à peu près tout ce dont vous avez besoin dans la commande find actuelle, alors jouez avec.

Voici quelques conseils utiles pour trier la sortie de recherche. L'option -printf vous offre de nombreuses options pour permettre un tri plus complexe et une présentation des informations sur les fichiers. C'est le meilleur pour des problèmes comme celui-ci. Jouez avec pour voir ce qui fonctionnera pour vous. En utilisant -printf, vous pouvez personnaliser et délimiter les résultats comme vous le souhaitez. Cela aide beaucoup lorsque vous devez post-traiter les résultats. J'espère que ça aidera quelqu'un.

  1. Si vous utilisez -ls et souhaitez trier par nom de fichier, le 11ème champ est le nom de fichier, vous pouvez donc effectuer les opérations suivantes. L'option de tri -k peut également prendre plusieurs champs pour trier.

    trouver / chemin -ls | trier -k11

  2. Si vous voulez un contrôle plus fin du grain par date / heure dans l'ordre croissant ou décroissant, utilisez l'option -printf "". Voir le manuel pour plus de détails, mais ce qui suit est un exemple qui s'imprimera en quelques fractions de seconde donc il est très précis.

EXEMPLE DATE / HEURE: 2016-09-17 + 12: 09: 57.9013929800

find /path -printf "%T+ %p\n" | sort -n # Ascending

find /path -printf "%T+ %p\n" | sort -nr # Descending

Une autre façon de procéder sans caractères dans la chaîne de date / heure est.

EXEMPLE DATE / HEURE: 20160917120013.8101685040

find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n
David Conger-Eldeen
la source