시간별 파일 정렬 문제

시간별 파일 정렬 문제

파일 세트에서 시퀀스 간격을 식별해야 합니다. 시퀀스는 FILENAME_0001에서 시작하여 FILENAME_9999에서 끝납니다. 그 후 시퀀스는 0001부터 다시 시작됩니다.

적절한 시퀀스 확인을 위해 ls -rt를 사용하여 수정 시간 순서대로 파일을 선택하고 이전 파일 시퀀스 번호와 비교합니다. 이전 파일이 9999라면 다음 파일이 0001인지 확인합니다(시퀀스 재설정을 수용하기 위해).

최근에 파일이 다음 순서로 나열되는 시나리오가 발생했습니다.

FILENAME_0001 
FILENAME_0002
FILENAME_0005
FILENAME_0003
FILENAME_0004
FILENAME_0006
FILENAME_0007

이는 파일 3, 4, 5의 수정 시간(초)이 동일하기 때문입니다. 단지 밀리초가 다릅니다. 그래서 나는 ls -rt가 초만 고려한다고 추측합니다. 누구든지 해결 방법을 제안할 수 있나요?

답변1

find가 있는 경우 printfmtime을 초 단위로 인쇄한 다음 파일 이름을 입력하고 를 사용 sort하고 마지막으로 다음을 사용합니다 cut.

find . -type f -printf "%T@\t%f\n" |
sort -k 1n -k 2 |
cut -f 2-

find는 각 행에 TIMESTAMP FILENAME을 인쇄합니다. 정렬은 타임스탬프를 숫자순으로 정렬하는 것부터 시작됩니다. 타임스탬프가 동일하면 최후의 수단으로 파일 이름을 사용합니다. Cut은 출력에서 ​​타임스탬프를 제거합니다.

편집: 귀하의 Perl 솔루션은 작동하지만 다르게 수행하겠습니다. 이것은 가장 간단합니다.

find . -type f -print | 
perl -lne 'print (((stat($_))[9]."\t".$_)' |
sort -k 1n -k 2 |
cut -f 2-

시간을 문자열로 변환했다가 다시 되돌릴 필요가 없습니다. find처럼 stat의 mtime을 숫자 값으로 출력하면 됩니다.

답변2

마침내 성공했습니다. 다음 코드를 사용했습니다.

for FILENAME in $(ls...); do
FILE_TIME=$(perl -e '@d=localtime ((stat(shift))[9]); printf "%4d%02d%02d%02d%02d%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]' $FILENAME)
echo "$FILE_TIME $FILENAME"
done | sort -k 1n -k 2 | cut -d" " -f2

HP-UX 시스템을 사용하고 있습니다.

관련 정보