csh
ls
내 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 +%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
- 귀하의 경우
{print $9}
공백을 포함하지 않는 사용자/그룹 이름 외에도 파일 경로에도 공백이 포함되어 있지 않다고 가정합니다. xargs
파일 경로에 백슬래시 또는 따옴표가 포함되어 있고 이를 C 로케일에서 실행하지 않는 경우 로케일 인코딩에서 텍스트로 인코딩되지 않은 파일 이름에 대해 이 원시 출력을 사용하면 실패합니다.- 디렉터리에 숨김 해제된 zip 파일이 없으면 csh에서 오류가 발생
No match
하고ls
실행되지 않지만(적어도ls
리터럴 모드를 사용하는 Bourne 스타일 호출보다 더 나은 동작임)xargs
계속 실행되며basename
계속 실행됩니다. 인수 없이 실행 한 번 실행하면 혼란스러운 오류가 발생할 수 있습니다.
답변2
.'$'
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