Comment convertir d'un format de date en un autre format?

11

J'ai un problème avec mon format de date. Je souhaite passer d'un format à l'autre et vice versa. Mes formats de date sont

Format 1

YYYY-MM-DD

Format 2

MM/DD/YYYY

Je veux changer le format 1 au format 2 et le format 2 au format 1.

AiB
la source
o pour être plus clair, j'ai le fichier file1 name: date 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. La sortie requise est 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 et vice
versa
Les barres obliques sont l'un des deux seuls caractères qui ne peuvent pas être dans un nom de fichier * nix ...
evilsoup

Réponses:

14

Utilisez GNU 'date' pour cela. Il convertira également entre d'autres formats pour vous (voir date --helpla liste des formats).

$ date -d 2013-07-05 +%m/%d/%Y
07/05/2013
$ date -d 07/05/2013 +%F
2013-07-05
Stéphane Chazelas
la source
pour être plus clair, j'ai le fichier file1 name: date 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. La sortie requise est 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 et vice
versa
1
@Abraham comment cela ne répond-il pas à cette exigence?
jordanm
6

En supposant que vous ayez des dates sous forme de texte qui doivent être converties

echo '2013-12-13' | awk -v FS=- -v OFS=/ '{print $2,$3,$1}'

Et vice versa

echo '12/13/2013' | awk -v FS=/ -v OFS=- '{print $3,$1,$2}'
iruvar
la source
pour être plus clair, j'ai le fichier file1 name: date 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. La sortie requise est 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 et vice
versa
Merci 1_CR, ça marche maintenant après avoir modifié un peu !! #! / bin / bash echo '$ 1- $ 2- $ 3' | awk -v FS = - -v OFS = / '{print $ 2, $ 3, $ 1}' data.file
AiB
@Abraham, vous devriez tenter votre chance avec l' dateapproche de drewbenn , qui est certainement plus élégante
iruvar
3
$ echo YYYY-MM-DD | { IFS=- read y m d && echo "$m/$d/$y"; }
MM/DD/YYYY

Si vous avez un fichier avec beaucoup de ces dates, un par ligne:

awk -F- -vOFS=/ '{print $2,$3,$1}' < that-file
Stéphane Chazelas
la source
0

En utilisant sed comme suit:

$ echo '2013-12-13' | sed -r 's/([[:digit:]]{2,4})-([[:digit:]]{1,2})-([[:digit:]]{1,2})/\2\/\3\/\1/g'
12/13/2013
$ echo '12/13/2013' | sed -r 's/([[:digit:]]{1,2})\/([[:digit:]]{1,2})\/([[:digit:]]{2,4})/\3-\1-\2/g'
2013-12-13
mark_infinite
la source
0

Pour répondre à la question clarifiée dans les commentaires sur la façon de modifier le format de date dans un nom de fichier, utilisez une variante de l' gnu dateapproche de drewbenn . Cette commande recherche tous les fichiers dans le dossier local et redirige uniquement le nom du fichier vers xargs, en remplaçant le datenom de fichier modifié en tant que deuxième argument mvauquel effectuer le renommage.

L'utilisation supplémentaire, légèrement détournée de la bashsubstitution de variables est nécessaire lors de l' bashévaluation de la datecommande.

find ./ -printf '%f\n' | xargs -I '{}' sh -c 'mv $1  $(date -j -f %Y-%m-%d $1 +%m/%d%Y)' -- {} \;
Rob
la source