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

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

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

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?

-newermt참고: 이 옵션은 SunOS에서는 지원되지 않으므로 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되면 $Source_files_Dir위의 내용이 제대로 작동하지 않는다는 점에 유의하세요. csh에서 "$Source_files"with로 바꾸는 것이 $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. 일반적으로 말해서, 뒤에 오는 내용이 Variable 인 경우 --옵션의 끝을 표시 해야 합니다.
  • zip 파일이 디렉토리 유형인 경우 해당 내용이 나열됩니다. ls일반적으로 glob이나 변경 가능한 데이터로 작업할 때 일반적으로 다음 -d옵션을 사용하는 것이 좋습니다.ls -ld -- ...
  • 특히 csh에서 $Source_files_Dir개행 문자를 포함하면 구문 오류가 발생합니다. $Source_files_Dir:q위에서 언급했듯이 csh가 더 좋습니다.
  • 어떤 경우 든 줄 기반 출력을 처리할 때 파일 경로( ls -l보고된 파일 이름 및 심볼릭 링크 대상도 포함) 에 줄 바꿈이 포함되어 있지 않다고 가정합니다.ls
  • 날짜/시간이 필드 6, 7, 8에 있다고 가정합니다. 사용자 이름이나 그룹 이름에 공백이 있으면 충돌이 발생합니다. 숫자 uid/gid를 얻기 위해 -n대신(또는 추가로) 을 사용하면 -l더 강력해집니다(그리고 잠재적으로 비용이 많이 드는 이름 변환을 피할 수 있습니다).
  • date +%d0으로 채워진 숫자 또는 많은 ls구현과 많은 로캘(C/POSIX 로캘의 POSIX 요구 사항)의 경우 공백( ) ls -l으로 채워진 숫자를 출력합니다.date +%e
  • ls -l가장 최근 날짜의 출력은 Mon dd HH:MM미래의 날짜가 아니라 Mon dd YYYY메서드가 처리할 수 없는 다른 날짜의 출력입니다.
  • -L옵션이 없으면 기호 링크의 경우 기호 링크가 가리키는 zip 파일의 수정 시간이 아니라 기호 링크의 수정 시간이 나열됩니다. perl또는 stat()대상의 실시간과 함께 사용됩니다 zsh.age
  • 귀하의 경우 {print $9}공백을 포함하지 않는 사용자/그룹 이름 외에도 파일 경로에도 공백이 포함되어 있지 않다고 가정합니다.
  • xargs파일 경로에 백슬래시 또는 따옴표가 포함되어 있고 이를 C 로케일에서 실행하지 않는 경우 로케일 인코딩에서 텍스트로 인코딩되지 않은 파일 이름에 대해 이 원시 출력을 사용하면 실패합니다.
  • 디렉터리에 숨김 해제된 zip 파일이 없으면 csh에서 오류가 발생 No match하고 ls실행되지 않지만(적어도 ls리터럴 모드를 사용하는 Bourne 스타일 호출보다 더 나은 동작임) xargs계속 실행되며 basename계속 실행됩니다. 인수 없이 실행 한 번 실행하면 혼란스러운 오류가 발생할 수 있습니다.

답변2

.'$'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

관련 정보