매일 나는 path 에 16개의 파일을 받습니다 /Home/h87654/file/
. 각 파일의 첫 번째 줄에는 오늘 날짜(YYYYMMDD)가 포함된 문자열이 있습니다. 날짜의 위치는 고정되어 있지 않으며 첫 번째 줄 어디든 가능합니다. 첫 번째 행의 날짜를 기준으로 매일 최신 파일이 도착하도록 하고 싶습니다.
광범위한 질문에 대해 사과드립니다.
저는 UNIX를 처음 사용합니다. 아래는 제가 작업 중인 코드입니다.
/Home/h87654/latest_file.txt 여기에는 첫 번째 줄에 해당 날짜가 포함된 16개의 파일이 모두 포함됩니다. 이 16개 파일 중에서 타임스탬프가 있는 최신 파일을 가져와야 합니다. 예를 들어 오늘 스크립트를 실행하면 2018-06-11입니다. 첫 번째 루프에서는 시작 날짜가 20180501이고 종료 날짜가 20180531인 최신_file.txt에는 첫 번째 줄에 20180501이 포함된 모든 파일이 포함됩니다. 파일의 마지막 항목과 해당 타임스탬프가 필요하며 둘 다 time.txt에 씁니다.
두 번째 루프인latest_file.txt에는 첫 번째 줄에 20180502가 포함된 모든 파일이 포함됩니다. 마지막 파일과 해당 타임스탬프가 필요하고 둘 다 time.txt에 추가됩니다.
세 번째 루프에서는 최신 파일.txt에 첫 번째 줄에 20180503이 포함된 모든 파일이 포함됩니다. 마지막 파일과 해당 타임스탬프가 필요하며 둘 다 time.txt에 추가하는 식으로 월말까지 계속됩니다. $종료일
cd /Home/h87654/file/
start_date=`date -d "-1 month -$(($(date +%d)-1)) days" +%Y%m%d` ##start of month in yyyymmdd
end_date=`date -d "-$(date +%d) days " +%Y%m%d` ##end of month in yyyymmdd
while [ "$start_date" > "$end_date" ]; ##execute for each day for a monnth
do
awk 'FNR==1{if($0~"$start_date")print FILENAME;}' /Home/h87654/file/*.* >/Home/h87654/latest_file.txt ##check ist date in the first line and print the file name
##am stuck here .. idk how to proceed
done
답변1
정확히 무엇을 요구하는지 잘 모르겠습니다.
첫 번째 줄에 최대 8자리 숫자가 포함된 파일의 경로를 얻으려면 다음을 사용하세요 zsh
.
getdate() {
local MATCH
IFS= read -r < $REPLY && [[ $REPLY =~ '[[:digit:]]{8}' ]]
REPLY=$MATCH
}
printf '%s\n' /Home/h87654/file/*.*(O+getdate[1])
최대 날짜와 해당 최대 날짜를 첫 번째 줄의 첫 8자리 시퀀스로 포함하는 모든 파일을 가져오려면 다음을 수행할 수 있습니다.
typeset -A bydate
for file (/Home/h87654/file/*.*) {
IFS= read -r line < $file &&
[[ $line =~ '[[:digit:]]{8]' ]] &&
bydate[$MATCH]+=$file$'\n'
}
latest=${${(kO)bydate}[1]}
printf 'Latest date: %s\nFiles:\n%s' $latest $bydate[$latest]