59 votes

Trouver la commande l'ordre de tri par défaut

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

Par exemple, si j'exécute

find . -type f -name '*mp3' 

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

Parfois, cela renvoie :

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

Vous pouvez voir comment d'abord le contenu du répertoire B est répertorié, puis celui du répertoire A. En même temps, à l'intérieur du répertoire A, les fichiers sont répertoriés dans un ordre étrange.

0 votes

De mon expérience, il semble être cohérent par installation, c'est-à-dire que si vous avez le même ensemble de fichiers sur deux machines, il renverra toujours un ordre sur une machine et un ordre complètement différent sur l'autre. Je me suis déjà demandé pourquoi, +1

3 votes

J'ai un émetteur FM dans ma voiture et il joue toujours des chansons de ma carte flash dans un ordre étrange. Je n'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.

1 votes

Au fait : la commande BSD find a le paramètre -s pour trier la sortie par ordre alphabétique.

41voto

rrichter Points 2273

find va parcourir l'arborescence des répertoires dans l'ordre où les éléments sont stockés dans les entrées de répertoire. Cela sera (pour la plupart) cohérent d'une exécution à l'autre, sur la même machine et sera essentiellement l' "ordre de création de fichiers/répertoires" s'il n'y a pas eu de suppressions.

Cependant, certains systèmes de fichiers réordonneront les entrées de répertoire lors d'opérations de compactage ou lorsque la taille de l'entrée doit être agrandie, il y a donc toujours une petite chance que l'ordre "brut" change au fil du temps. Si vous souhaitez un ordre cohérent, faites passer la sortie à travers une étape de tri supplémentaire.

0 votes

Merci pour votre réponse détaillée! Donc, si mon émetteur FM (voir mon commentaire précédent) joue les pistes dans l'ordre où la commande de recherche les répertorierait, je ne suis pas en mesure de contrôler l'ordre dans lequel je voudrais qu'elles soient jouées.

0 votes

Eh bien, la carte flash utilise probablement un système de fichiers FAT et si je me souviens bien, il est assez facile de manipuler l'ordre des entrées FAT avec un débogueur de système de fichiers. Il peut être utile de copier les chansons de la carte flash actuelle sur une nouvelle carte flash, dans l'ordre dans lequel vous souhaitez les lire, cela pourrait être plus facile.

0 votes

Une des applications utiles de cette cohérence est une estimation de progression lente find /chemin/ -exec ... avec l'exécution beaucoup plus rapide de find /chemin/ pour obtenir d'abord une liste triée des fichiers.

14voto

jason saldo Points 5036

Vous ne devez pas compter sur un ordre de sortie particulier de find et devriez plutôt utiliser sort et d'autres moyens pour contrôler spécifiquement l'ordre.

0 votes

Ne fonctionne pas pour find -ls

0 votes

@mirabilos: En ignorant un instant le fait que vous ne devriez pas analyser ls , que signifie "ne fonctionne pas"  ? Car, bien sûr, vous pouvez trier la sortie de `find -ls`.

0 votes

C'est drôle, d'abord vous dites que vous ne devriez pas analyser ls (ce qui est vrai, mais ce n'est pas ce que j'allais faire), puis vous dites que vous pouvez analyser ls (eh bien, find -ls) la sortie pour la trier (ce qui est également incorrect, comparez `131359 76 -rw-r--r-- 1 userid userid 74226 Nov 29 2023 tmp/mmm.jpg` à `134322 4 -rw-r--r-- 1 userid userid 2273 Jan 25 02:13 tmp/Pangrams`, ce n'est pas triable.

13voto

J'ai travaillé sous UNIX/Linux respectivement depuis 1984/1991 et la première commande que j'ai apprise était find. Linux/GNU a mis à peu près tout ce dont vous avez besoin dans la commande find actuelle, donc jouez avec.

Voici quelques conseils utiles pour trier la sortie de find. L'option -printf vous donne 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 cela aidera quelqu'un.

  1. Si vous utilisez -ls et que vous voulez trier par nom de fichier, le 11e champ est le nom du fichier donc vous pouvez faire ce qui suit. L'option de tri -k peut également prendre plusieurs champs sur lesquels trier.

    find /chemin -ls | sort -k11

  2. Si vous voulez un contrôle plus fin, c'est-à-dire trier par date/heure dans l'ordre ascendant ou descendant, utilisez l'option -printf "". Consultez le manuel pour plus de détails, mais voici un exemple qui affichera avec des secondes fractionnaires pour une grande précision.

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

find /chemin -printf "%T+ %p\n" | sort -n # Ascendant

find /chemin -printf "%T+ %p\n" | sort -nr # Descendant

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

EXEMPLE DATE/HEURE : 20160917120013.8101685040

find /chemin -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n

3 votes

Cela ne répond pas à la question ("quelle est l'ordre de tri par défaut?").

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X