파일 이름에 제공된 일련 번호를 기준으로 최신 파일을 선택하십시오.

파일 이름에 제공된 일련 번호를 기준으로 최신 파일을 선택하십시오.

내 디렉터리에는 파일이 몇 개밖에 없으며 처리할 가장 오래된 파일을 선택해야 합니다.

Exp의 경우: /tmp 디렉토리에 다음 파일이 있습니다.

Sample_0000237826-001_xyz.dat
Sample_0000437564-001_xyz.dat
Sample_0000237826-002_xyz.dat
Sample_0000137294-003_xyz.dat

따라서 내 스크립트는 먼저 파일 이름의 첫 번째 10자리 세트를 기준으로 파일을 정렬해야 합니다.오코코콕, 첫 번째 10자리 숫자 집합에 대해 여러 항목이 있으면 다음 3자리 숫자 집합을 정렬해야 합니다.에 에, 가장 오래된 것을 선택해야 합니다.

처리할 파일을 선택한 후에는 해당 파일을 디렉터리에서 삭제합니다. 따라서 다음에 실행하면 나타나지 않습니다.

따라서 첫 번째 실행에서는 Sample_0000137294-003_xyz.dat 파일을 선택해야 합니다.

두 번째 실행에서는 Sample_0000237826-001_xyz.dat를 선택해야 합니다.

세 번째 실행에서는 Sample_0000237826-002_xyz.dat를 선택해야 합니다.

등.

모두가 잊어버린 사실 중 하나는 위에서 언급한 대로 이 파일이 원격 서버에서 내 로컬 서버로 하나씩 복사된다는 것입니다. 그래서 저는 복사를 위해 "rsync"를 사용합니다. 따라서 아래 제공된 솔루션이 rsync 명령에도 작동하는지 알려주십시오.

답변1

그리고 zsh:

extract_numbers() REPLY=${(SM)REPLY##<->-<->}
for file (*<->-<->*.dat(no+extract_numbers)) {
  do-what-you-will-with $file
}

일치하는 파일 이름(양의 십진수와 일치)의 ubstring을 extract_numbers반환하는 정렬 함수( )를 정의합니다 .SM<->-<-><->

우리는 이 함수를 사용하여 전역 을 n숫자로 o정렬합니다 *<->.<->*.dat.

답변2

가설

  • 모든 파일이 Sample로 시작하지 않습니다.
  • 숫자 필드는 다음과 같이 표시됩니다._
  • 파일 시간을 전달할 수 없습니다.

나는 사용할 것이다

sort -t_ -k2n

예제에 제공된 4개 파일의 출력

Sample_0000137294-003_xyz.dat
Sample_0000237826-001_xyz.dat
Sample_0000237826-002_xyz.dat
Sample_0000437564-001_xyz.dat

답변3

#!/bin/bash

ls /tmp/*dat > filelist

while read fn
do 
    #do something with /tmp/$fn
done < filelist

답변4

이 명령은 패턴이 다음과 같다고 가정할 때 숫자 필드로 정렬된 한 파일의 파일 이름만 제공합니다 Sample_nnnnnnnnnn-ppp_xyz.dat.

ls Sample_$(ls -l *.dat | awk -F ' |_' {'print $10'} |sort -n| head -1)*.dat

관련 정보