비슷한 이름의 로그 파일을 여러 디렉터리로 이동하는 효율적인 방법

비슷한 이름의 로그 파일을 여러 디렉터리로 이동하는 효율적인 방법

CIFS 공유에 다음 형식의 많은 서버 로그 파일이 포함된 10000개 이상의 파일이 있는 디렉터리가 있습니다.CCLLLTTTFFFFNNN YYYY-MM-DD 최저 한도에서. 어디:

  • 서버 이름은 다음 부분으로 구성됩니다.
    • CC= ISO 국가 이름
    • LLL= 위치(가장 가까운 도시의 IATA 코드)
    • TTT= WIN또는 UNX(그리고 CIFS 공유인 이유)
    • FFFF= 서버 기능
    • nnn= 숫자
  • 공간
  • 날짜
  • 때때로 더 많은 텍스트에 공백이 포함된 단어가 포함되어 있는 경우가 있습니다.
  • 연장됨(항상)

더 이상 회사에서 일하지 않는 사람이 이를 설정하면 전 세계의 모든 서버가 여기에 일일 로그를 덤프합니다.그리고 파일 목록을 로드하는 데 시간이 오래 걸립니다! 통나무가 필요한 사람은 누구나 징징거리고 불평하고 있다 불평하다그런데 아무도 아무것도 안 하니까 내가 시작했어요.무엇그것에 대해단지 나를 위해.

아이디어:

긴 파일 목록을 갖는 대신 짧은 디렉토리 목록(서버 이름을 포함하여 최소 2자리 더 짧음)과 cron모든 파일을 매일 해당 디렉토리로 이동하는 스크립트를 사용하는 것은 어떨까요?^

나한테는 뭐가 있지?

  • bash
  • 입력하다gcc
  • CIFS 공유에 대한 쓰기 액세스 권한(당연히)
  • 만자로, 아치 스핀오프
  • 개발사무실

나는 지금까지 무엇을 했는가?

  • ls /mnt/logshare/*UNXSAP* > ~/Documents/logs/logshare.txt
  • logshare.txt를 OpenOffice Calc로 가져오기
    • 서버 이름을 사용하여 디렉터리 생성
    • mvCalc 및 수식을 사용하여 다수의 명령 생성
  • 이것을 복사해서 쉘 스크립트에 붙여넣으세요.
  • 쉘 스크립트 실행

하지만:

  • 나는 내 성공의 희생자가 되었습니다.
  • 보안 및 애플리케이션 그룹은 내 디렉터리가 나타나는 것을 보고 내가 자기중심적인 행동을 멈추고 이를 위해 그렇게 하기를 원했습니다.모든 사람.
  • 진짜 개발자도 없고, 진짜 스크립터도 없습니다.
  • 일주일 동안 이것에 대해 생각해 봤는데 어디서부터 시작해야 할지조차 모르겠습니다. awk? find? C 코드 작성을 다시 시작하시겠습니까? (20년 넘게 이 일을 해본 적이 없습니다. 불행하게도 나는 항상 두려워했던 일이 되었습니다.양복...) ;-(
  • 새로운 서버가 추가될 때마다 디렉토리가 자동으로 생성됩니다.
  • 스크립트는 매일 실행되어야 합니다.

자신의 서버/데이터 파일 수집에 대해 이 문제를 이미 해결하고 bash수정할 수 있는 스크립트(C 소스?)를 갖고 있는 사람이 있습니까?그렇지 않은 경우: 유용한 팁을 제공해 주세요.

참고 1:예, 서버가 서버 이름을 딴 디렉터리에 로그를 덤프하도록 하는 것이 현명하지만 배포, CAB 및 전 세계 모든 서버 관리자를 동원하는 것과 같은 기타 골치 아픈 작업이 필요합니다. ..

답변1

각 서버에 대한 디렉터리 생성

find /var/mnt/logshare/ -maxdepth 1 -type f | cut -d' ' -f1 | sort -u |
while read server ; do
  mkdir "$server"
done

우리가 하는 일:

  • -type f하위 디렉터리가 아닌 logshare 디렉터리에서 파일(및 파일만) 검색( -maxdepth 1)
  • 서버 이름은 파일 이름의 첫 번째 공백으로 구분된 부분이므로 우리 cut
  • 정렬만 하고 -u고유 항목 유지
  • 클릭할 때마다 목차 만들기

그에 따라 파일을 이동하세요.

find /var/mnt/logshare -maxdepth 1 -type d | 
while read server ; do
   mv "$server?*" "$server"
done
  • 로그 공유에서 디렉터리를 검색하지만 더 깊이 검색하지는 않습니다.
  • 디렉터리 이름은 로그 파일 이름의 첫 번째 부분과 같습니다.
  • 서버라고 부르지만 더 긴 내용을 디렉터리로 이동합니다.

답변2

노력하다,

cd /path/to/files/ || exit
for f in *' '*; do
    mkdir -p -- "${f%% *}" &&
      mv -- "$f" "${f%% *}/"
done

관련 정보