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.