Bash에서 타임스탬프 추출 및 형식 지정

Bash에서 타임스탬프 추출 및 형식 지정

각 파일의 전체 경로가 포함된 파일 목록을 반환하는 스크립트가 있습니다. 예를 들어 - root/folder/file@1610565763436. 그래서 출력은 다음과 같습니다

/root/folder/file@1610565763436
/root/folder/file@1610568241000
/root/folder/file@1610597041000
/root/folder/file@1610625841000
/root/folder/file@1610654641000
/root/folder/file@1610683441000
/root/folder/file@1610712242000
/root/folder/file@1610741041000
/root/folder/file@1610769841000
/root/folder/file@1610798641000
/root/folder/file@1610827441000
/root/folder/file@1610856241000
/root/folder/file@1610885041000
/root/folder/file@1610913841000

사람이 읽을 수 있는 타임스탬프만 출력되도록 출력 형식을 지정하고 싶습니다. 타임스탬프를 얻기 위해 a를 시도했지만 cut -d "@" -f 2xargs에 파이프하고 date 명령을 실행해도 작동하지 않았습니다. 즉 /bin/bash scriptToGetFiles | cut -d "@" -f 2 | xargs date -d {}.

FWIW, 위 명령을 실행하면 xargs -t오류가 반환됩니다.

date -d @ 1610565763436 1610568241000 1610597041000 1610625841000 1610654641000 1610683441000 1610712242000 1610741041000 1610769841000 1610798641000  
date: extra operand ‘1610568241000’

어떤 제안이나 조언이라도 감사하겠습니다.

답변1

GNU 날짜를 사용하세요:

$ echo /root/folder/file@1610565763436 | cut -d@ -f2 | xargs -I '{}' echo {} / 1000  | bc  | xargs -I '{}' date --date=@{}
Wed Jan 13 20:22:43 CET 2021

FreeBSD에서:

$ echo /root/folder/file@1610565763436 | cut -d@ -f2 | xargs -I '{}' echo {} / 1000  | bc  | xargs  date -r
Wed Jan 13 20:22:43 CET 2021 

답변2

일반 bash를 사용하면 printfEpoch 시간 형식을 지정할 수 있습니다.

processThatOutputsStuff | while IFS=@ read -r path date; do
    printf '%(%c)T\n' "${date%???}"
done

${date%???}매개변수 확장변수 값에서 마지막 3자를 제거합니다.

다른 날짜/시간 형식을 원하면 %c.

관련 정보