![SunOS의 csh에서 특정 시간 이후에 생성된 파일 찾기](https://rvso.com/image/231043/SunOS%EC%9D%98%20csh%EC%97%90%EC%84%9C%20%ED%8A%B9%EC%A0%95%20%EC%8B%9C%EA%B0%84%20%EC%9D%B4%ED%9B%84%EC%97%90%20%EC%83%9D%EC%84%B1%EB%90%9C%20%ED%8C%8C%EC%9D%BC%20%EC%B0%BE%EA%B8%B0.png)
내 SunOS 시스템에서 , 및 을 사용 하여 오후 7시 이후에 생성된 모든 파일을 찾으려고 합니다 csh
.ls
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
?
참고: 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 파일 중 디렉토리 유형이 있으면 해당 내용이 나열됩니다.
ls
glob 또는 일반적으로 가변 데이터와 함께 사용할 때 일반적으로 다음-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 +%d
0이 채워진 숫자를 출력하는 반면, 많은ls
구현과 많은 로케일(C/POSIX 로케일의 POSIX 요구 사항)에서는ls -l
공백이 채워진 숫자(date +%e
)를 출력합니다.ls -l
Mon dd HH:MM
미래가 아닌 최근 날짜에 대한 출력 이 아니라Mon dd YYYY
귀하의 접근 방식에서 처리할 수 없는 다른 날짜에 대한 출력입니다.- 옵션이 없으면
-L
심볼릭 링크의 경우 심볼릭 링크가 가리키는 zip 파일의 수정 시간이 아닌 심볼릭 링크의 수정 시간이 나열됩니다.perl
의stat()
또는zsh
은age
대상의 mtime과 함께 작동합니다. - 을 사용하면
{print $9}
공백이 포함되지 않은 사용자/그룹 이름 외에도 파일 경로도 공백이 포함되어 있지 않다고 가정합니다. - 파일 경로에 백슬래시나 따옴표가 포함된 경우 해당 원시 출력에 대한 사용이
xargs
실패하고 C 로케일에서 실행하지 않으면 해당 로케일의 인코딩에서 텍스트로 인코딩되지 않은 파일 이름에 대해 실패합니다. - 디렉토리에 숨김 해제된 zip 파일이 없으면 csh에서 오류가 발생 하고
No match
실행ls
되지 않습니다(적어도ls
문자 그대로 패턴으로 호출되는 Bourne 스타일 동작보다 낫습니다).xargs
실행되며basename
혼란스러운 오류를 일으킬 가능성이 있는 인수 없이 한 번만 실행됩니다.
답변2
오늘 날짜를 변수에 저장 '$'
하는 대신 csh에 대한 답변을 얻었습니다 .backticks
today
awk
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