연도/월/일/시간 디렉터리 구조에서 최신 파일을 가져옵니다.

연도/월/일/시간 디렉터리 구조에서 최신 파일을 가져옵니다.

데이터베이스 백업을 디렉터리 구조에 저장합니다.

year/month/day/time/backup_name

예는 다음과 같습니다

basics_mini/2012/11/05/012232/RATIONAL.0.db2inst1.NODE0000.20110505004037.001 basics_mini/2012/11/06/012251/RATIONAL.0.db2inst1.NODE0000.20110505003930.001

백업 파일의 타임스탬프는 사용할 수 없습니다. 자동 테스트가 시작되기 전 서버 시간은 2011년 5월 5일로 설정됩니다.

따라서 문제는 "기본 디렉터리"(기초지식_미니)를 코딩하고 싶은 특정 기능에 추가합니다.

최신 데이터베이스를 복원해야 합니다. 나는 이것을 PHP로 하고 있는데 간단한 쉘 스크립트 솔루션이 있는지 궁금합니다.

답변1

귀하의 필요에 맞는 것을 찾으세요:

find "/path/to/backup_dir" -type f|sort -r|head -n1

이는 월 및 일 폴더에 앞에 0이 있는 경우에만 작동합니다(예제에서와 같이).

특정 파일 이름(또는 패턴)으로 백업하려면 조회 매개변수에 이름 패턴을 추가하세요.

find "/path/to/backup_dir" -type f -name "*db2inst1*"|sort -r|head -n1

...또는 -iname대소문자를 구분하지 않는 모드의 경우

이제 위 명령을 자세히 설명하겠습니다.

  • find "/path"추가 필터링을 사용하지 않는 한 지정된 경로의 모든 파일/디렉터리를 반복적으로 나열합니다.
  • 매개변수 찾기는 -type f모든 비정규 파일을 필터링합니다.)
  • -name또는 -iname특정 패턴을 기반으로 파일 일치
  • sort출력을 역순으로 정렬( -r)
  • head -n1-n 1입력( )의 첫 번째 줄만 인쇄하고 인쇄한 후 즉시 종료합니다.

답변2

find 'basics_mini' -type f | 
sed 's/.*basics_mini\///' |
sort -t '/' -k1nr -k2nr -k3nr -k4nr |
head -1

그러면 백업 디렉터리에서 파일을 찾아 sed선행 경로(디렉터리까지 year)를 제거합니다. 그런 다음 경로 이름을 "/"로 구분하고 필드 1, 2, 3, 4, 즉 연, 월, 일, 시간에 대해 숫자 정렬을 수행합니다. 마지막으로 head -1출력의 맨 위 행이 반환됩니다.

물론 동일한 최신 항목이 여러 개 있더라도 이는 1개의 파일만 반환합니다(걱정되는 경우).

답변3

이 명명 구성표를 사용하면 최신 백업이 사전순으로 마지막 하위 디렉터리에 있습니다. 와일드카드가 사전순으로 확장된다는 점을 활용하여 셸에서 직접 최신 디렉터리를 가져올 수 있습니다.

cd basics_mini
set [0-9][0-9][0-9][0-9]/*/*/*
shift $(($#-1))
echo "The most recent backup is in $1"

zsh에서는 glob 한정자를 사용하여 마지막 디렉터리를 직접 가져올 수 있습니다.

echo "The most recent backup is in" basics_mini/[0-9][0-9][0-9][0-9]/*/*/*([-1])

답변4

find -maxdepth 1 -type ['d' for directory or 'f'for file] | ls -t | head -1 .. 

이것은 작동합니다.

관련 정보