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 표준 라이브러리의 알고리즘 구현 에 따라 달라집니다 .