awk와 date 명령을 함께 사용해 보세요

awk와 date 명령을 함께 사용해 보세요

ls -l이번 달에 마지막으로 수정된 파일만 사용하고 필터링 하려고 합니다 . 실행 중: ls -l | awk '{if($6 == date +%b) print$0;구문 오류가 발생했습니다.

awk 및 스크립트 배싱에서 따옴표를 올바르게 사용하는 방법에 대한 간단한 규칙을 인터넷 전체에서 찾아봤지만 알 수 없습니다. 내 프로그래밍 경험에도 불구하고 나는 이것 때문에 매우 혼란스러워서 이 특정 상황을 다루는 구체적인 답변보다 이러한 질문에 대한 일반적인 답변을 더 환영합니다.

답변1

date아마도 코드에서 이를 여러 번 호출 하고 싶지 않을 것입니다 . 런타임 동안에는 "일정"합니다. 그래서 우리는 그것을 미리 설정하고 변수로 전달할 수 있습니다

예를 들어

ls -l | awk -v month="$(date +%b)" '$6 == month { print }'

이번 달에 시작했지만 1년이 지난 파일이 있거나(예: 2015년 8월부터), 월 이름에 공백이 포함된 로케일에 있거나, 파일 이름에 개행 문자가 포함된 경우 이 작업은 실패합니다. ls의 출력을 구문 분석하는 데에는 위험이 따릅니다.

답변2

그런 다음 변형으로 이 루프를 시도해 보세요. 오늘의 현재 월과 연도를 저장한 다음 쉘 글로빙( *)을 사용하여 파일 목록( ls -lwill과 유사하지만 will과는 아님 ls -al)을 가져온 다음 GNU 제공 stat명령을 사용하여 각 파일의 수정 시간을 가져오고 월 및 년도. 월 및 연도가 현재 월 및 연도와 동일하면 ls -ld파일에 대해 다음을 수행하십시오(이 -d플래그는 $f가 디렉토리일 때 실수로 하위 디렉토리가 나열되는 것을 방지하기 위한 것입니다).

thisym=$(date +%Y-%m)
for f in *
do
  ym=$(stat -c %y -- "$f" | cut -d- -f1-2)
  if [ "$ym" = "$thisym" ]
  then
    ls -ld -- "$f"
  fi
done

관련 정보