가장 오래된 파일을 smbclient의 log.txt에 넣습니다.

가장 오래된 파일을 smbclient의 log.txt에 넣습니다.

우리는 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 명령을 다음 두 명령으로 바꿀 수 있습니다.

  1. smbclient ... dir-- 파일 목록 가져오기
  2. 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. 현재 가장 오래된 날짜 값을 현재 시간으로 초기화합니다. 가장 오래된 파일은 최소 1초 이상 오래되었을 것으로 예상합니다.
  2. 해당 행이 일치하면 / N /일반 파일(디렉토리 기준)을 보고 있는 것으로 보입니다.
  3. 행이 주어진 정규 표현식과 일치하는 경우(N, 바이트 크기, 타임스탬프, 그 뒤에 행의 끝만 일치시키려고 시도함 $)
  4. 타임스탬프 추출
  5. 파일 이름 추출
  6. 파일 이름에서 후행 공백 제거
  7. 파일의 타임스탬프를 초로 변환하려면 GNU 날짜를 요청하세요.
  8. 현재 파일이 기존 파일보다 오래된 경우 타임스탬프와 파일 이름을 저장하세요.
  9. 마지막으로 가장 오래된 파일 이름을 인쇄하십시오.

나는 이것에 대해 적어도 두 가지 문제를 알고 있습니다.

  1. 실제 파일 이름이 공백으로 끝나는 경우(Windows에서도 완벽하게 합법적이라고 생각함) 프로세스가 실패합니다.방법 - awk 스크립트는 공백 자체를 자르고 명령 대체는 후행 공백도 제거합니다.
  2. (어떤 종류의) 특수 문자를 포함하는 파일의 이름이 변경됩니다. 예를 들어, 이라는 파일을 생성하면 foo$'\n'barsmbclient 명령이 대신 파일 이름으로 dir표시됩니다 .FKCEWC~I

관련 정보