TMW_yyyymm=`date +%Y%m --date='tomorrow'`
YDY_yyyymmdd=`date +%Y%m%d --date='yesterday'`
YDY_yyyymm=`date +%Y%m --date='yesterday'`
TODAY=`date +'%Y%m%d'`
SRC_LOG="/home/user/bin/abc.log.${YDY_yyyymmdd}"
HOMEDIR="/home/user/bin"
DEST="/log/user/abc"
위 내용은 이전 동료로부터 받은 이전 스크립트의 일부이며 다음을 수행하도록 수정해야 했습니다.
SRC_LOG에는 abc.log.[yyyymmdd].[0-n] 형식의 로그 파일이 여러 개 있습니다.
예를 들어
abc.log.20230221.0
abc.log.20230221.1
abc.log.20230221.2
잠깐만요, 하루에 얼마나 많은 로그 파일이 생성될지 모르겠습니다.
"SRC_LOG" 디렉터리를 반복하여 같은 날의 모든 로그 파일을 가져온 다음 해당 날짜의 모든 로그 파일을 새 로그 파일로 병합하도록 스크립트를 수정하고 싶습니다.
문제는 내가 bash 스크립트에 익숙하지 않고 매일 필요한 파일을 추출하는 방법, 즉 접미사 .0 .1 .2 ... 등을 반복하는 방법을 모른다는 것입니다.
도움을 주시면 감사하겠습니다. 감사합니다!
답변1
나는 무엇을 할 것인가:
오늘:
d=$(date +%Y%m%d)
find ./dir -name "abc.log.${d}.[0-9]*" -exec cat {} + > "${d}.log'
#rm ./dir/abc.log.${d}.*
다른 날짜에 적응
답변2
다음 로그 파일이 있는 경우특정 날짜$SRC_LOG
디렉토리 에서 :
printf '%s\n' "$SRC_LOG"/abc.log.* | sort -V | xargs cat > "/path/to/${SRC_LOG##*/}"
sort -V
.0
앞에 접미사가 정렬되어 있는지 확인하세요..10
${SRC_LOG##*/}
결합된 로그의 새 파일 이름으로 경로에서 디렉터리 구성 요소를 제거합니다.
필요에 따라 대상 디렉터리를 변경합니다.
다음 로그 파일이 있는 경우다양한 날짜$SRC_LOG
디렉토리 에서 :
cd "$SRC_LOG"
printf '%s\n' abc.log.* | cut -d. -f-3 | sort -u |
xargs -I{} sh -c 'printf "%s\n" "$1".* | sort -V |
xargs cat > "/path/to/$1"' sh '{}'
모든 로그 파일의 파일 이름을 인쇄하고 접미사 부분을 제거한 다음 고유하게 정렬하여 접미사 없이 모든 로그 파일 이름을 가져옵니다.
그런 다음 결과는 에 전달됩니다 xargs
. 각 인수에 대해 접미사가 포함된 로그 파일 이름을 인쇄하는 스크립트를 시작하고 결과와 cat
이러한 파일을 출력 파일로 정렬합니다.
GNU 도구를 사용하여 탭이나 개행 문자가 있는 파일 이름의 더 안전한 null 종료 버전은 다음과 같습니다.
printf '%s\0' "$SRC_LOG"/*.log.* | sort -zV | xargs -0 cat > "/path/to/${SRC_LOG##*/}"
그리고
printf '%s\0' *.log.* | cut -zd. -f-3 | sort -zu |
xargs -0I{} sh -c 'printf "%s\0" "$1".* | sort -zV |
xargs -0 cat > "/path/to/$1"' sh '{}'