나는 다음을 수행하고 싶습니다 :
주어진 패턴과 일치하는 주어진 디렉토리의 파일 수를 가져옵니다. 예를 들면 다음과 같습니다.
ExtractBackup_{date}.tar.gz
숫자가 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 /
행운을 빌어요:-)