¿Cómo convertir de un formato de fecha a otro formato?

11

Tengo un problema con mi formato de fecha. Quiero cambiar de un formato a otro y viceversa. Mis formatos de fecha son

Formato 1

YYYY-MM-DD

Formato 2

MM/DD/YYYY

Quiero cambiar el formato 1 al formato 2 y el formato 2 al formato 1.

AiB
fuente
o sea más claro, tengo el archivo file1 name: fecha 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. La salida requerida es 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 y viceversa
AiB
Las barras diagonales son uno de los dos únicos caracteres que no pueden estar en un nombre de archivo * nix ...
evilsoup 05 de

Respuestas:

14

Use GNU 'date' para esto. También se convertirá entre otros formatos para usted (consulte date --helpla lista de formatos).

$ date -d 2013-07-05 +%m/%d/%Y
07/05/2013
$ date -d 07/05/2013 +%F
2013-07-05
Stéphane Chazelas
fuente
para ser más claro, tengo el nombre del archivo file1: fecha 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. La salida requerida es 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 y viceversa
AiB
1
@Abraham, ¿cómo no cumple con ese requisito?
jordanm
6

Suponiendo que tiene fechas en forma de texto que deben convertirse

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

Y viceversa

echo '12/13/2013' | awk -v FS=/ -v OFS=- '{print $3,$1,$2}'
iruvar
fuente
para ser más claro, tengo el nombre del archivo file1: fecha 2000-01-01 2000-01-02 2000-01-03 2000-01-04 .. La salida requerida es 01 / 01.2000 01/02/2000 01/03 / 2000 01/02/2000 y viceversa
AiB
Gracias 1_CR, ¡está funcionando ahora después de que modifiqué un poco! #! / bin / bash echo '$ 1- $ 2- $ 3' | awk -v FS = - -v OFS = / '{print $ 2, $ 3, $ 1}' data.file
AiB
@Abraham, deberías probar suerte con el dateenfoque de drewbenn , que sin duda es más elegante
iruvar
3
$ echo YYYY-MM-DD | { IFS=- read y m d && echo "$m/$d/$y"; }
MM/DD/YYYY

Si tiene un archivo con muchas de esas fechas, una por línea:

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

Usando sed de la siguiente manera:

$ 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
fuente
0

Respondiendo la pregunta aclarada en los comentarios sobre cómo cambiar el formato de fecha en un nombre de archivo, use una variante del enfoque de drewbenn gnu date. Este comando encuentra todos los archivos en la carpeta local y canaliza solo el nombre del archivo xargs, sustituyendo el datenombre de archivo modificado como el segundo argumento al mvque realiza el cambio de nombre.

El uso adicional y ligeramente tortuoso de la bashsustitución de variables es necesario al bashevaluar el datecomando.

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