SunOS의 csh에서 특정 시간 이후에 생성된 파일 찾기

SunOS의 csh에서 특정 시간 이후에 생성된 파일 찾기

내 SunOS 시스템에서 , 및 을 사용 하여 오후 7시 이후에 생성된 모든 파일을 찾으려고 합니다 csh.lsawk

ls -l  "${Source_files_Dir}"/*.zip| awk -v today="$(date "+%b %d")" '{
date=$6" "$7; time=$8; if (date == today && substr(time,1,2) >= 19)
print $9 }'|xargs -n 1 basename

이 명령은 에서는 작동 ksh하지만 에서는 작동하지 않습니다 csh. 에서 어떻게 이를 달성할 수 있나요 csh?

참고: SunOS -newermt에서는 옵션이 지원되지 않으므로 find위 명령을 사용해 보았습니다 ls.

답변1

어쨌든 그 접근 방식은 매우 불안정하므로 다음을 사용하는 것이 좋습니다 perl.

perl -MPOSIX -MFile::Basename -le '@start = localtime; @start[0..2] = (0,0,19); $start = mktime(@start); for (@ARGV) {print basename$_ if @s = stat$_ and $s[9] >= $start}' -- "$Source_files_Dir"/*.zip

이번 세기에 왜 csh를 사용하게 될지는 모르겠지만 개행 문자가 포함된 csh경우 위의 내용이 제대로 작동하지 않는다는 점에 유의하세요. csh에서는 with로 $Source_files_Dir바꾸는 것이 더 나을 것입니다(그러나 다른 쉘에서는 더 이상 작동하지 않습니다)."$Source_files"$Source_files:q

일반적으로 Solaris(이전에는 SunOS로 알려짐)도 zsh설치되어 있으며 다음을 수행하기만 하면 됩니다.

autoload age
print -rC1 -- $Source_files_Dir/*.zip(Ne[age 19:00]:t)

접근 방식의 몇 가지 문제점을 나열하십시오.

  • ls -l "${Source_files_Dir}"/*.zip: $Source_files_Dir로 시작 하면 에서는 -옵션으로 처리됩니다 ls. 일반적으로 --다음에 나오는 내용이 가변적이라면 옵션의 끝을 표시해야 합니다.
  • zip 파일 중 디렉토리 유형이 있으면 해당 내용이 나열됩니다. lsglob 또는 일반적으로 가변 데이터와 함께 사용할 때 일반적으로 다음 -d옵션을 사용하려고 합니다.ls -ld -- ...
  • 특히 csh에서 $Source_files_Dir개행 문자가 포함되어 있으면 구문 오류가 발생합니다. $Source_files_Dir:q위에서 언급한 것처럼 csh에서 더 좋습니다.
  • 어떤 경우든 줄 기반 ls -l출력을 처리할 때 파일 경로(보고하는 파일 이름 및 심볼릭 링크 대상)에 개행 문자가 포함되어 있지 않다고 가정합니다 ls.
  • 날짜/시간이 필드 6, 7, 8에 있다고 가정합니다. 필드 6, 7, 8은 사용자 또는 그룹 이름에 공백이 포함된 경우 분리됩니다. 숫자 uid/gid를 얻기 위해 -n대신(또는 추가로) 을 사용하면 -l더 강력해집니다(그리고 잠재적으로 비용이 많이 드는 이름 변환을 피할 수 있습니다).
  • date +%d0이 채워진 숫자를 출력하는 반면, 많은 ls구현과 많은 로케일(C/POSIX 로케일의 POSIX 요구 사항)에서는 ls -l공백이 채워진 숫자( date +%e)를 출력합니다.
  • ls -lMon dd HH:MM미래가 아닌 최근 날짜에 대한 출력 이 아니라 Mon dd YYYY귀하의 접근 방식에서 처리할 수 없는 다른 날짜에 대한 출력입니다.
  • 옵션이 없으면 -L심볼릭 링크의 경우 심볼릭 링크가 가리키는 zip 파일의 수정 시간이 아닌 심볼릭 링크의 수정 시간이 나열됩니다. perlstat()또는 zshage대상의 mtime과 함께 작동합니다.
  • 을 사용하면 {print $9}공백이 포함되지 않은 사용자/그룹 이름 외에도 파일 경로도 공백이 포함되어 있지 않다고 가정합니다.
  • 파일 경로에 백슬래시나 따옴표가 포함된 경우 해당 원시 출력에 대한 사용이 xargs실패하고 C 로케일에서 실행하지 않으면 해당 로케일의 인코딩에서 텍스트로 인코딩되지 않은 파일 이름에 대해 실패합니다.
  • 디렉토리에 숨김 해제된 zip 파일이 없으면 csh에서 오류가 발생 하고 No match실행 ls되지 않습니다(적어도 ls문자 그대로 패턴으로 호출되는 Bourne 스타일 동작보다 낫습니다). xargs실행되며 basename혼란스러운 오류를 일으킬 가능성이 있는 인수 없이 한 번만 실행됩니다.

답변2

오늘 날짜를 변수에 저장 '$'하는 대신 csh에 대한 답변을 얻었습니다 .backtickstodayawk

set today=`date "+%b %d"`
ls -l "$Source_files_Dir"/*.zip | awk -v today="$today" ' \
{ \
    date=$6" "$7; \
    time=$8; \
    if (date == today && substr(time,1,2) >= 19) print $9; \
}'|xargs -n 1 basename

관련 정보