누군가 이 말을 해석할 수 있나요?
sFileName=`ls -lrt $sTmpPath/$1* | grep ^- | grep -v grep | head -1 | awk 'BEGIN { FS="/" } { print $NF }'`
여기
$sTmpPath
UNIX 서버의 임시 경로를 포함합니다.- 전달된 첫 번째 매개변수는 파일 이름입니다.
감사합니다
Gautam
답변1
ls -lrt
: 디렉토리가 아닌 매개변수를 나열하고콘텐츠해당 디렉토리 매개변수의 형식은 시간(수정 시간) 역순 (가장 오래된 것부터 최신 것까지)l
의 ong 형식 입니다. 해야한다 .r
t
ls -lrtd --
$sTmpPath/$1*
: should be :"$sTmpPath/$1"*
의 목적은$sTmpPath
내가 생각하는 이름으로 시작하는 파일 목록을 나열하는 것입니다$1
.grep ^-
. 여러 껍질 중에서 특별하기grep '^-'
때문에 더욱 좋습니다 .^
로 시작하는 줄을 유지하세요-
. this 의 출력에서ls -l
이것은 다음 줄입니다.정기적인다른 유형의 파일(디렉토리, 심볼릭 링크, 소켓...)은 제외됩니다. 일부 파일 이름이나 기호 링크 대상에 개행 문자가 포함되어 있으면 거짓 긍정이 발생할 수도 있습니다.grep -v grep
. 제외 포함grep
아마도 이 기사를 쓴 사람은 이ps | grep -v grep
트릭에 대해 생각하고 있었을 것입니다. 여기에는 아무런 의미가 없습니다.head -1
. 고대 형태head -n 1
: 입력의 첫 번째 줄을 선택합니다. 따라서 가장 오래된 일치 파일의 줄입니다.BEGIN{FS = "/"}
: 사용하려는 awk 필드 구분 기호를 로 설정합니다/
.-F/
{print $NF}
: 마지막으로 구분된 필드, 즉 파일 이름인/
마지막 필드 뒤의 줄 부분을 인쇄합니다. 및 의 작업/
은awk
완료될 수 있습니다 .grep
head
$sTmpPath
따라서 이 스크립트의 목적은 .로 끝나는 이름을 보고하는 것 같습니다 $1
.
이는 다음과 같이 단순화되고 부분적으로 수정될 수 있습니다.
ls -nrtd -- "$sTmpPath/$1"* | awk -F/ '/^-/ {print $NF; exit}'
-n
대신 이를 사용하여 -l
uids/gid를 사용자 이름/그룹 이름으로 불필요하게 변환하는 것을 방지하세요.
파일 이름이나 기호 링크 대상 모두 개행 문자를 포함하지 않는다고 가정합니다.
그것으로 zsh
, 당신은 단지 oldest=($sTmpPath/$1*(.Om[1]:t))
.