출력에 대한 일부보고를 자동화하는 작업을위한 스크립트를 작성하려고합니다. 로그 파일은 다음과 같은 경로 구조에 저장됩니다 (현재는 향후 ‘표준화 중’).
/<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 0
101 개 이상의 결과가있을 때 프롬프트를 제거 set page-completions off
하고 호출기를 비활성화합니다.
답변
ls -tr | tail -1
트릭을해야합니다.