쉘 스크립트에서 파일의 액세스 날짜를 추출하고 싶습니다. 다음 스크립트를 작성해 보았지만 작동하지 않습니다. 내가 에코할 때방문일, 출력은 "직원"입니다.
file=$1
accessday=$(ls -lu $file | cut -d ' ' -f 6)
답변1
이것은 직업입니다 stat
.
사람이 읽을 수 있는 형식으로 마지막 액세스 시간을 얻으려면 다음을 수행하십시오.
stat -c '%x' file.txt
에포크 이후 경과된 시간(초):
stat -c '%X' file.txt
답변2
ls -lu
일반적인 출력 을 보면
-rw-r--r-- 1 someuser somegroup 74 Mar 29 05:21 filename
그룹 이름 앞에는 총 5개의 공백 문자가 있음을 알 수 있습니다. 따라서 명령에 지정한 필드 6은 cut
그룹(귀하의 경우 "staff")을 반환합니다.
또한 방문일은 표기상 6번이 아닌 7번 필드가 됩니다.
한 가지 해결책은 을 사용하는 것입니다 awk
. 이는 기본값으로 필드 구분 기호의 여러 발생을 처리하기 때문입니다.
accessday=$(ls -lu $file | awk '{print $7}')
답변3
귀하의 질문에 따라 stat를 사용하여 출력을 정규화한 다음 원하는 날짜만 표시하도록 잘라낼 것입니다.
stat -c '%x' FILENAME | cut -c 9,10
답변4
ls
다음의 출력을 구문 분석합니다.어렵고 항상 가능하지는 않습니다. 이는 타임스탬프를 추출하려는 경우 때때로 필요한 대체 방법이지만(유일한 이식 가능한 방법: 모든 시스템에 명령이 있는 것은 아님 stat
) 사람이 읽을 수 있는 타임스탬프를 얻게 됩니다.기계가 읽을 수 있는 형태로 변환하기 어려움. 최소한 어려운 부분을 수정하십시오. 사용자 및 그룹 필드를 생략하는 전달 -o
및 -g
옵션(일부 시스템에서는 이러한 필드에 공백이 포함되어 출력에서 구분이 불가능할 수 있음 ls
). 그런 다음 타임스탬프는 필드 4-6(1부터 시작하여 번호가 매겨짐)을 차지합니다.
access_time=$(ls -dlogu -- "$file" | awk '1 {print $4, $5, $6}')
해당 월의 날짜를 원하는 경우 지난 6개월 이내의 타임스탬프인지 여부에 따라 두 가지 출력 형식을 구별해야 합니다. 안정적인 출력 형식을 위해 로캘을 C로 설정합니다. 이 형식에서는 해당 월의 날짜가 항상 두 번째 타임스탬프 필드입니다.
access_day=$(ls -dlogu -- "$file" | awk '1 {print $5}')