2011-11-21 2 views
3

j'ai utilisé une boucle pour comme dans mon script ... cetri des fichiers dans un répertoire basé sur l'index numérique dans les noms de fichiers

for var in ipsec_packet*.txt; do 
echo $var 
done 

sortie

ipsec_packet10.txt 
ipsec_packet11.txt 
ipsec_packet12.txt 
ipsec_packet13.txt 
ipsec_packet14.txt 
ipsec_packet15.txt 
ipsec_packet16.txt 
ipsec_packet17.txt 
ipsec_packet18.txt 
ipsec_packet1.txt 
ipsec_packet2.txt 
ipsec_packet3.txt 
ipsec_packet4.txt 
ipsec_packet5.txt 
ipsec_packet6.txt 
ipsec_packet7.txt 
ipsec_packet8.txt 
ipsec_packet9.txt 

mais je veux les à partir de 1 à la plus grande disponible (ici 18) dans l'ordre trié comme ceci ..

ipsec_packet1.txt 
ipsec_packet2.txt 
... 
... 
ipsec_packet18.txt 

J'ai essayé sort -n k14 mais cela n'a pas aidé. S'il vous plaît me suggérer une variation de genre ou toute autre fonctionnalité bash/awk qui pourrait m'aider.

+0

Peut-être que 'awk' est mauvais outil pour le tri des données. –

Répondre

3

Vous pouvez essayer d'utiliser sort avec l'option -V utilisée pour tri naturel des nombres dans le texte:

+0

mon tri (GNU coreutils) 6.10 n'a pas -V – Kent

1

Si GNU type n'est pas disponible (c.-à--V est pas pris en charge) et si Perl est acceptable:

perl -le' 
    print join $/, 
    map $_->[1], 
     sort { 
     $a->[0] <=> $b->[0] 
     } map [/(\d+)\./, $_], 
      glob shift 
    ' '*.txt' 

Autre possibilité:

printf '%s\n' *.txt | 
    sed 's/.*[^0-9]\([0-9]*\)\./\1,&/' | 
    sort -n | 
     cut -d, -f2- 
0

Je préférerais codaddict's solution, mais voici un sed + sort astuce pour quand votre sort n'a pas -V:

for var in $(ls ipsec_packet*.txt | sed 's/[0-9]/\t&/' | sort -n -k2 | sed 's/\t//') 
do 
    echo $var 
done 

Vous pouvez remplacer \t avec un seul caractère qui fait n'apparaît pas dans vos données d'entrée et spécifie ce caractère comme séparateur de champ sort avec -t.

0

Cela pourrait fonctionner pour vous:

ls -v ipsec_packet*.txt 
Questions connexes