tr “” “” ne fonctionne pas correctement

J’essaie de ne couper que la partie date d’un ls -lrth | grep TRACK ls -lrth | grep TRACK Sortie ls -lrth | grep TRACK :

 -rw-r--r-- 1 ins ins 0 Dec 3 00:00 TRACK_1_20121203_01010014.LOG -rw-r--r-- 1 ins ins 0 Dec 3 00:00 TRACK_0_20121203_01010014.LOG -rw-r--r-- 1 ins ins 0 Dec 13 15:10 TRACK_9_20121213_01010014.LOG -rw-r--r-- 1 ins ins 0 Dec 13 15:10 TRACK_8_20121213_01010014.LOG 

Mais en faisant ceci:

 ls -lrth | grep TRACK | tr "\t" " " | cut -d" " -f 9 

ne me donne que les dates à deux chiffres et des espaces pour les chiffres simples:

 13 13 

J’ai donc essayé quelque chose avec la commande tr , pour traduire toutes les dates à un chiffre en deux chiffres:

 ls -lrth | grep TRACK | tr "\t" " " | tr "[1-9]" "['01'-'09']" | cut -d" " -f 9 

Mais cela donne des résultats bizarres et ne sert évidemment pas mon but. Des idées sur la façon d’obtenir le bon résultat?

Ne pas parsingr la sortie de ls .

ls est un outil de recherche interactive sur les informations de fichiers. Sa sortie est formatée pour les humains et provoquera des bogues dans les scripts. Utilisez des globs ou find plutôt. Comprenez pourquoi: http://mywiki.wooledge.org/ParsingLs

Je recommande cette façon:

Si vous voulez la date et le chemin du fichier:

 find . -name 'TRACK*' -printf '%a %p\n' 

Si vous ne voulez que la date:

 find . -name 'TRACK*' -printf '%a\n' 

Vous pourriez essayer une autre approche avec quelque chose comme

 find . -name 'TRACK*' -exec stat -c %y {} \; | sort 

Vous pouvez append quelque chose comme | cut -f1 -d' ' | cut -f1 -d' ' si vous avez seulement besoin de la date.

Je suppose que cela suffit:

 ls -lhrt | grep TRACK | awk '{print $6, $7, $8}' 

Ce type de substitution serait mieux géré par le biais de sed :

 ls -lrth | grep TRACK | sed 's/ \+/ /g;s/ \([0-9]\) / 0\1 /g' | cut -d" " -f 7 

Comme déjà dit, ne jamais parsingr la sortie de ls !

Comme vous ne voulez que l’heure de modification, la date la commande a une option intéressante pour cela: option -r ( man date pour plus d’informations).

Par conséquent, vous voulez probablement cela au lieu de votre ligne:

 for i in TRACK*; do date -r "$i"; done 

Je ne sais pas comment vous voulez le format de la date, alors jouez avec les options, par exemple,

 for i in TRACK*; do date -r "$i" "+%D"; done 

(les formats sont en man date ).

Utilisez stat pour obtenir des informations sur un fichier.

En outre, tr ne fait que la traduction de caractère un à un. Il ne remplacera pas les séquences à un caractère avec celles à deux caractères.