bash glob에서 하나의 결과 만 선택할 수 있습니까?


14

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

/<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

답변:


9

다음은 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]}"

이것은 확실히 가정용 컴퓨터에서 작동하지만 직장에서 작동한다고 보장 할 수는 없습니까?
Pureferret

@Pureferret 작동하지 않을 수있는 부분은 음의 배열 인덱스 ( -1)입니다. 이것은 bash 4.2에서 추가되었습니다. RHEL5는 아마도 가장 오래된 지원되는 주류 엔터프라이즈 배포판이며 bash 4.2.20을 사용합니다.
Patrick

1
이전 버전의 bash이 : "${list[@]: -1}"처럼 ksh93( [-1]에서 온다 zsh).
Stéphane Chazelas

@ Patrick-RHEL5는 bash를 사용합니다 3.2. RHEL 3 및 4는 연장 된 수명으로 여전히 지원됩니다.
jordanm

1
@Pureferret 배열 길이로 산술을 수행 할 수도 있습니다. 내 편집을 참조하십시오.
Gilles 'SO- 악한 중지'

10

POSIXly :

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

당신이 언급 한 이후 zsh:

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

4

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

파이프 라인의 기본값은 -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하고 호출기를 비활성화합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.