우리는 1개 사이트에 94대의 PC를 보유하고 있습니다. 폴더가 있고 각 컴퓨터의 해당 폴더에서 가장 오래된 파일을 확인해야 합니다.
모든 IP가 포함된 .txt 파일을 반복할 수 있지만 가장 오래된 파일을 확인하고 가져와서 log.txt에 추가하는 방법을 모르겠습니다. 이 로그에 있는 파일 이름이 필요합니다.
while read line; do
IP=$(echo $line | cut -d ';' -f 2)
NAME=$(echo $line | cut -d ';' -f 1)
smbclient '\\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; get TheOldestFile" >> log.txt
smbclient를 사용하여 이것이 가능합니까?
답변1
smbclient 명령 세트가 전체 쉘을 구현하지 않는다는 점을 감안할 때 가장 좋은 아이디어(smbaunting 공유 및 로컬 쉘 유틸리티 사용 제외)는 "ls를 구문 분석"하는 것입니다.
상위 수준에서는 단일 smbclient 명령을 다음 두 명령으로 바꿀 수 있습니다.
smbclient ... dir
-- 파일 목록 가져오기smbclient ... get
-- 가장 오래된 파일을 가져옵니다.
나는 귀하와 유사한 환경을 갖고 있지 않기 때문에 다음과 같이 대체할 "무엇"을 제시합니다.
filename=$(smbclient '\\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; dir" | awk -f parse-smbclient-ls)
smbclient '\\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; get $filename"
구문 분석-smbclient-ls의 내용은 다음과 같습니다.
BEGIN {
"date +%s" | getline oldesttime
}
/ N / {
# size thu mar dd dd:dd:dd dddd
if (match($0, / N +[[:digit:]]+ +[[:alpha:]]{3} [[:alpha:]]{3} +[[:digit:]]+ [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2} [[:digit:]]{4}$/)) {
timestamp=sprintf("%s %s %s %s %s", $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF)
filename=substr($0, 3, RSTART-3)
# trim trailing whitespace -- *** hope the real filename doesn't end in whitespace
sub(/ +$/, "", filename);
("date --date='"timestamp"' +%s") | getline seconds
if (seconds < oldesttime) {
oldesttime=seconds
oldestfile=filename
}
}
}
END {
print oldestfile
}
awk 스크립트로 들어갑니다:
- 현재 가장 오래된 날짜 값을 현재 시간으로 초기화합니다. 가장 오래된 파일은 최소 1초 이상 오래되었을 것으로 예상합니다.
- 해당 행이 일치하면
/ N /
일반 파일(디렉토리 기준)을 보고 있는 것으로 보입니다. - 행이 주어진 정규 표현식과 일치하는 경우(N, 바이트 크기, 타임스탬프, 그 뒤에 행의 끝만 일치시키려고 시도함
$
) - 타임스탬프 추출
- 파일 이름 추출
- 파일 이름에서 후행 공백 제거
- 파일의 타임스탬프를 초로 변환하려면 GNU 날짜를 요청하세요.
- 현재 파일이 기존 파일보다 오래된 경우 타임스탬프와 파일 이름을 저장하세요.
- 마지막으로 가장 오래된 파일 이름을 인쇄하십시오.
나는 이것에 대해 적어도 두 가지 문제를 알고 있습니다.
- 실제 파일 이름이 공백으로 끝나는 경우(Windows에서도 완벽하게 합법적이라고 생각함) 프로세스가 실패합니다.둘방법 - awk 스크립트는 공백 자체를 자르고 명령 대체는 후행 공백도 제거합니다.
- (어떤 종류의) 특수 문자를 포함하는 파일의 이름이 변경됩니다. 예를 들어, 이라는 파일을 생성하면
foo$'\n'bar
smbclient 명령이 대신 파일 이름으로dir
표시됩니다 .FKCEWC~I