파이썬heapq.nsmallest

파이썬heapq.nsmallest

x개의 가장 오래된 파일(FIFO)을 디렉토리로 이동하는 명령을 작성 중입니다. 결과를 "find"디렉토리로 파이프하는 것이 더 낫습니까 "ls", 아니면 그냥 " ls"을 사용하는 것이 더 낫습니까? 더 나은지 제안해 주십시오.

ls -ltr `/bin/find ${in}/* -prune -name "*.txt"  -type f` | head -10 |     
 while read -r infile ; do                    
     -move the file 
done

아니면 그냥 사용해야 할까요? 제가 사용하고 있는 이유는: ls. 스크립팅에서 피해야 할 몇 가지 find내용을 온라인에서 읽었기 때문입니다. ls하지만 코드 끝에서 조회 결과 를 ls.find

답변1

하지만진주아마도 큰 디렉토리를 "x"번 반복하는 것보다 빠를 것입니다. 이것은 무차별적인 간단한 솔루션입니다.

외부 루프는 이동할 파일 수(이 경우 3개)를 결정합니다. 이 루프에서는 "가장 오래된" 파일을 globbing 에 의해 생성된 첫 번째 파일 이름으로 초기화합니다 *. 그런 다음 내부 루프는 각 파일의 타임스탬프를 비교하여 -ot현재 가장 오래된 파일보다 오래된지( ) 확인합니다. 그렇다면 "가장 오래된" 파일 이름을 업데이트합니다. 내부 루프가 끝나면 파일을 보고하고 이동합니다.

for((count=0; count < 3; count++))
do
  set -- *
  oldest=$1
  for f in ./*
  do
    if [ "$f" -ot "$oldest" ]
    then
      oldest=$f
    fi
  done
  echo mv -- "$oldest" ./.archive
  mv -- "$oldest" ./.archive
done

답변2

파이썬heapq.nsmallest

큰 타격:

find -printf '%T@ %p\n' |
python noldest.py 1000 |
xargs -Ixxx mv xxx directory_for_old_files

find명령은 "1970년 이후의 초 수(%T@), 공백, 파일 이름(%p)" 형식으로 파일을 나열합니다. 후행 xargs명령은 표준 입력에서 파일 이름을 하나씩 가져오고 mv xxx directory_for_old_files명령을 사용하여 xxx를 해당 이름으로 바꿉니다.

noldest.py 구현은 다음과 같습니다.

import sys
from heapq import nsmallest
from datetime import datetime


n = int(sys.argv[1])
date_file_pairs = (line.split(' ', maxsplit=1) for line in sys.stdin)  # generators are lazy

def parse_date(date_and_filename):
    seconds_from_1970 = float(date_and_filename[0])
    return datetime.fromtimestamp(int(seconds_from_1970))

for _, filename in nsmallest(n, date_file_pairs, key=parse_date):
    print(filename.rstrip('\n'))  # lines in sys.stdin have trailing newlines

nsmallest성능은 Python 표준 라이브러리의 알고리즘 구현 에 따라 달라집니다 .

관련 정보