bash glob에서 하나의 결과 만 선택할 수 있습니까? 구조에 저장됩니다

출력에 대한 일부보고를 자동화하는 작업을위한 스크립트를 작성하려고합니다. 로그 파일은 다음과 같은 경로 구조에 저장됩니다 (현재는 향후 ‘표준화 중’).

/<root_path>/<process_one_path>/logs/<time_date_stamp>/<specific_log_file>

/<root_path>/<process_two_path>/logs/<different_time_date_stamp>/<specific_log_file>

폴더에서 항상 최신 인 날짜 스탬프를 제외하고 경로의 모든 부분을 알고 있습니다.

타임 스탬프 대신 와일드 카드를 사용하려고하면 다음과 같은 여러 가지 결과가 나타납니다.

> ls /<root_path>/<process_two_path>/logs/* [tab]
20130102-175103
20130118-090859
20130305-213506

최신 버전 만 반환하고 싶습니다 .Bash로 가능합니까?

NB



답변

다음은 bash 4.2에서 작동합니다.

list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[-1]}"

bash가 이전 버전 인 경우 :

list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[${#list[@]}-1]}"

답변

POSIXly :

 set -- /<root_path>/<process_two_path>/logs/*
 shift "$(($# - 1))"
 printf '%s\n' "$1"

당신이 언급 한 이후 zsh:

 print -r /<root_path>/<process_two_path>/logs/*([-1])

답변

bash for 루프에서 bash glob을 사용하십시오. 이처럼 :

for filename in <logdir>/*; do :; done; echo "$filename"

이것은 배쉬가 확장을 알파벳순으로 정렬한다는 사실에 달려 있습니다. 자세한 내용 은 bash 매뉴얼 을 읽으십시오 . LC_COLLATE에 의존합니다 . 이는 filename루프가 종료 된 후에도 변수 에 마지막 값이 여전히 포함되어 있다는 사실에 따라 다릅니다 .

타임 스탬프가 가장 오래된 파일 이름을 원하면 다음과 같이 할 수 있습니다.

for filename in <logdir>/*; do echo "$filename"; break; done

답변

파이프 라인의 기본값은 -1이며 ls 출력은 이미 정렬되어 있어야합니다.

ls | tail -n1

다른 사람들이 대화식으로 첫 번째 또는 마지막 결과를 삽입하는 방법을 찾고 있다면 .inputrc에서 메뉴 완성 또는 메뉴 완성-뒤로 바인딩 할 수 있습니다.

"\e\t": menu-complete
"\e[Z": menu-complete-backward # shift-tab

show-all-if-ambiguous가 활성화 된 경우 set completion-query-items 0101 개 이상의 결과가있을 때 프롬프트를 제거 set page-completions off하고 호출기를 비활성화합니다.


답변

ls -tr | tail -1

트릭을해야합니다.