Comment faire pour trier les fichiers numériquement à partir de linux en ligne de commande

Bon, maintenant, c'est plus un coup de gueule à propos de Linux, qu'une question, mais peut-être que quelqu'un sait comment faire ce que je veux. Je sais que ce peut être atteint à l'aide de la sort de commande, mais je veux une meilleure solution car faire que le travail est à peu près aussi facile que d'écrire un programme en C pour faire la même chose.

J'ai des fichiers, pour l'amour du arguments, disons que j'ai les fichiers suivants: (mes fichiers sont les mêmes, j'ai juste beaucoup plus)

  • file-10.xml
  • file-20.xml
  • file-100.xml
  • file-k10.xml
  • file-k20.xml
  • file-k100.xml
  • file-M10.xml
  • file-M20.xml
  • file-M100.xml

Maintenant, cela s'avère être l'ordre, je veux les trier en. D'ailleurs, c'est l'ordre dans Windows qu'ils sont, par défaut, triés sur. C'est gentil. Groupes Windows consécutives des caractères numériques dans un effectif de caractère qui trie par ordre alphabétique avant la lettre.

Si j'type ls à la ligne de commande de linux, j'ai le des ordures. Avis de la 20 est déplacé. C'est une grande affaire quand j'ai des centaines de ces fichiers que je veux afficher dans un rapport, dans l'ordre.

  • file-100.xml
  • file-10.xml
  • file-20.xml
  • file-k100.xml
  • file-k10.xml
  • file-k20.xml
  • file-M100.xml
  • file-M10.xml
  • file-M20.xml

Je peux utiliser ls -1 | sort -n -k 1.6 pour obtenir les sans 'k' ou 'M' correct...

  • file-k100.xml
  • file-k10.xml
  • file-k20.xml
  • file-M100.xml
  • file-M10.xml
  • file-M20.xml
  • file-10.xml
  • file-20.xml
  • file-100.xml

Je peux utiliser ls -1 | sort -n -k 1.7 pour ne rien obtenir d'elle correcte

  • file-100.xml
  • file-10.xml
  • file-20.xml
  • file-k10.xml
  • file-M10.xml
  • file-k20.xml
  • file-M20.xml
  • file-k100.xml
  • file-M100.xml

Bien, très bien. Nous allons vraiment faire les choses. ls -1 | grep "file-[0-9]*\.xml" | sort -n -k1.6 && ls -1 file-k*.xml | sort -n -k1.7 && ls -1 file-M*.xml | sort -n -k1.7

  • file-10.xml
  • file-20.xml
  • file-100.xml
  • file-k10.xml
  • file-k20.xml
  • file-k100.xml
  • file-M10.xml
  • file-M20.xml
  • file-M100.xml

Ouf! Garçon heureux "la puissance de la ligne de commande linux" m'a permis de là. (Ce n'est pas pratique pour ma situation, parce que, au lieu de ls -1 j'ai une commande qui est une autre ligne ou deux de long)

Maintenant, le comportement de Windows est simple, élégant, et est-ce que vous souhaitez faire 99% du temps. Pourquoi je ne peux pas que sous linux? Pourquoi, oh pourquoi ne sort pas un "automagique trier des nombres dans un sens qui ne me faites pas bang tête dans le mur" switch?

Voici le pseudo-code C++:

bool compare_two_strings_to_avoid_head_injury(string a, string b)
{
    string::iterator ai = a.begin();
    string::iterator bi = b.begin();
    for(; ai != a.end() && bi != b.end(); ai++, bi++)
    {
        if (*ai is numerical)
            gobble up the number incrementing ai past numerical chars;
        if (*bi is numerical)
            gobble up the number incrementing bi past numerical chars;
        actually compare *ai and *bi and/or the gobbled up number(s) here
            to determine if we need to compare more chars or can return the 
            answer now;
    }
    return something here;
}

Était dur? Quelqu'un peut-il mettre cela en de les trier et de m'en envoyer une copie? S'il vous plaît?

  • Vous pourriez avez enregistré vous-même un peu de douleur en remplissant les champs numériques pour la même durée avec des zéros à gauche, au lieu de s'appuyer sur une plate-forme spécifique caprices pour obtenir l'ordre de tri que vous voulez. Just sayin'....
  • Je ferai remarquer que, peut-être le comportement de Windows est-ce que vous souhaitez faire 99% du temps, mais ce n'est pas juste de dire qu'il fait ce que tout le monde veut 99% du temps. Comme une question de fait, je pourrais tout aussi bien faire la même plainte au sujet de Windows tri que vous avez fait à propos de Linux du tri. (Il serait bien d'avoir cela comme une option pour sort bien)
  • Qu'est-ce que la programmation est question ici? Si vous voulez juste pour trier les noms de fichiers, quelqu'un à superuser.com peut-être être en mesure de vous aider.
  • Windows n'a pas toujours de cette façon. Voir support.microsoft.com/kb/319827
  • Lewis, Un) je n'ai jamais compté sur une plate-forme de comportement spécifique à n'importe quel point dans mon processus, et pourtant ce sont quand même venus jusqu', incroyable, non? B) vous êtes totalement à côté de la question. Maintenant, d'autre part, si vous voulez aller de travers et renommer des centaines de fichiers que j'ai déjà, je serais obligé 🙂 au Lieu de reconnaître comme un problème avec linux (qui il est, l'ensemble de la tri -n -k touche matos est total BS), apparemment la réponse est "Mauvais utilisateur! Ne pas le faire de cette façon! Revenir en arrière et de recréer tout en sachant ce que vous allez faire avec elle dans le futur!"
  • oui vous l'avez fait d'utiliser une plate-forme spécifique caprice, à savoir le fait que dir groupes de numéros consécutifs dans "un moyen efficace de caractère", alors que ls ne l'est pas. Bien que, techniquement, c'est un caprice de la dir programme, pas de Windows. De même, ce que vous appelez un problème avec Linux est en fait un "problème" avec un programme particulier, sort. (Et d'ailleurs, il n'est pas un problème de la même manière qu'une légitime bug est un problème, c'est juste une décision de conception qui leur arrive pas à la hauteur de vos exigences. Qui arrive de temps en temps sur chaque plate-forme.)
  • Pas de. Je n'ai pas compter sur la plate-forme spécifique bizarreries. Même si je l'ai fait, une attitude de blâmer l'utilisateur ne va pas aider. Mon point est que le tri est cassé (ok je ne dis pas "linux"), comme il a besoin d'une meilleure façon de trier les nombres dans les fichiers. La méthode actuelle, qui consiste à compter les caractères en face de vos numéros, est juste de la merde totale. Et je suis plutôt surpris une meilleure façon n'est pas là. J'ai passé beaucoup de temps à la recherche, pour l'un, en supposant qu'il doit être. Étant donné le nombre infini de linux programmes en ligne de commande, le meilleur moyen est apparemment le nombre de commande sed chaîne que j'ai utilisé ci-dessous??? Bon sang!

InformationsquelleAutor Scott | 2010-07-24