다음과 같은 날짜 파일 목록이 있습니다 ...
filename_20120101.dat
filename_20120102.dat
filename_20120103.dat
파일 이름의 날짜(파일의 날짜 스탬프가 아님)를 기반으로 최신 파일을 선택하는 스크립트가 필요합니다.
답변1
zsh 강제 답변:
echo "The highest-numbered file is" filename_*.dat([-1])
이것은글로벌 예선 [NUM]
NUM번째 일치 항목만 유지됩니다(음수 값은 마지막 일치 항목부터 계산됩니다). 너비가 서로 다른 경우 n
한정자를 추가하세요 .
% ls
filename_1.dat filename_12.dat filename_17.dat filename_2.dat filename_8.dat
% echo filename_*.dat([-1])
filename_8.dat
% echo filename_*.dat(n[-1])
filename_17.dat
와일드카드는 단어 목록을 찾는 상황에서만 발생하므로 변수에 파일 이름을 할당하려면 변수를 하나의 요소가 있는 배열로 설정해야 합니다.
latest=( filename_*.dat([-1]) )
echo "The highest-numbered file is $latest"
모든 셸에서 전체 일치 목록에 대한 위치 인수를 설정하고 마지막 인수를 유지할 수 있습니다.
set_latest () {
eval "latest=\${$#}"
}
set_latest filename_*.dat
echo "The highest-numbered file is $latest"
filename_10.dat
is after filename_09.dat
하지만 before 처럼 숫자순이 아닌 알파벳순으로 마지막 항목을 반환한다는 점을 명심하세요 filename_9.dat
.
답변2
ls(1)
이름별로 파일을 정렬 ls | tail -1
하면 됩니다.
답변3
1-라이너:
# for numerical order
find . -maxdepth 1 -name '*.dat' -print | sort -rV | head -n1
# for alphabetical order
find . -maxdepth 1 -name '*.dat' -print | sort -r | head -n1
ls
참고: 대신 사용할 수 있습니다 find
.
답변4
파일 이름이 완전히 숫자인 경우 ls가 파일을 알파벳순으로 정렬하고 10이 9 앞에 나타나기 때문에 먼저 정렬을 통해 파이프해야 합니다.
$ touch {1..10)
$ ls | tail -1
> 9
$ ls | sort -n | tail -1
> 10