패턴과 일치하는 디렉터리의 파일 수를 가져오고 가장 오래된 파일을 삭제합니다.

패턴과 일치하는 디렉터리의 파일 수를 가져오고 가장 오래된 파일을 삭제합니다.

나는 다음을 수행하고 싶습니다 :

  1. 주어진 패턴과 일치하는 주어진 디렉토리의 파일 수를 가져옵니다. 예를 들면 다음과 같습니다.

    ExtractBackup_{date}.tar.gz

  2. 숫자가 2 이상이면 패턴과 일치하는 가장 오래된 파일이 삭제됩니다.

Korn Shell( ) 스크립트를 사용하여 .ksh이 작업을 어떻게 수행 할 수 있습니까?

답변1

패턴과 일치하는 파일 수를 계산하는 직접적인 방법은 없지만 두 가지 간단한 단계로 계산할 수 있습니다. 파일 목록을 생성하고 목록의 길이를 가져옵니다. 날짜가 YYYYMMDD 형식이라고 가정합니다(이로 인해 위치 매개변수가 손상된다는 점에 유의하세요).

set ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz
if [ -e "$1" ]; then count=$#; else count=0; fi

ksh93에서는 일치하는 파일이 없으면 목록을 비워서 계산을 단순화할 수 있습니다. 어떤 파일과도 일치하지 않는 패턴은 한 단어를 포함하는 목록으로 대체됩니다(즉, 패턴 자체). ksh93에는 패턴을 빈 목록으로 확장하는 구성이 있습니다. Ksh에는 배열이 있으므로 위치 인수를 망칠 필요가 없습니다.

backups=(~(N:ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz))
count=${#backups[@]}

날짜가 YYYYMMDD 형식인 경우 가장 오래된 파일이 목록의 첫 번째 항목이 됩니다.

set ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz
if [ $# -ge 2 ]; then rm "$1"; fi

답변2

좋습니다. 패턴을 매개변수로 사용하여 이 스크립트를 실행합니다. 여러 파일이 일치하면 가장 오래된 파일이 삭제됩니다. 예:

$ ksh dtof.sh ?? # this will delete the oldest two-character file

스크립트:

for i in "$@"; do
  if [ ! "$oldest" ]; then
    oldest="$i"
    continue
  fi
  if [ "$i" -ot "$oldest" ]; then
    oldest="$i"
    reap="$i"
  else
    reap="$oldest"
  fi
done
[ "$reap" ] && rm "$reap"

답변3

ksh에 대해 모르므로 결합할 수 있는 몇 가지 도구를 알려 드리겠습니다.

현재 폴더에서 특정 패턴과 일치하는 모든 파일을 찾아 개수를 반환합니다.

find . -maxdepth 1 -type f -name '*.tgz' | wc -l

가장 오래된 파일을 선택하려면 아래 출력에서 ​​첫 번째 항목을 선택하세요.

ls -t1p | grep -v /

행운을 빌어요:-)

관련 정보