로그 상단에 폴더 이름($date)을 추가한 후 동일한 로그에서 21번째 줄을 잘라내어 실행 스크립트에 값으로 추가합니다.

로그 상단에 폴더 이름($date)을 추가한 후 동일한 로그에서 21번째 줄을 잘라내어 실행 스크립트에 값으로 추가합니다.

스크립트를 작성하려고 하는데 추가할 마지막 부분에서 막혔습니다.

이 스크립트는 내 서버의 일부 경로를 내 Google 드라이브와 동기화합니다. 내 서버에 삭제되거나 수정된 ​​파일이 있으면 /old/date/gdrive의 경로로 이동됩니다.

oldlog="/boot/logs/old-log.txt"
del=""
date=$(date +"%Y-%m-%d-%H%M")
--backup-dir "${dest}/old/${date}"

이것은 완벽하게 작동하지만 파일을 수동으로 삭제해야 하므로 /old/이를 변경하고 싶습니다.

그래서 나에게 필요한 것은 항상 로그에 줄 1을 $date쓰고 로그의 다른 모든 줄을 한 줄 아래로 이동하는 것입니다. $oldlog쓰기 $date로그는 쓰기 로그와 일치해야 하므로 $date동일 --backup-dir "${dest}/old/${date}"합니다.

따라서 로그는 xx일 1일 후에 다음과 같이 작동해야 합니다.

2019-07-01-1800

2일

2019-07-02-1800
2019-07-01-1800

3 일

2019-07-03-1800
2019-07-02-1800
2019-07-01-1800

그래서 다음 부분을 위해. 위의 예와 같이 로그를 업데이트한 후 21번째 줄을 가져와 oldlog.txt해당 줄을 삭제하고 스크립트에 $del.

oldlog="/boot/logs/old-log.txt"
del=
rclone purge "${dest}/old/${del}"

이제 줄이 비어 있으면 내부의 모든 내용이 지워지지 않도록 임의의 텍스트여야 합니다 /old/. 아니면 좀 더 고급 접근 방식을 사용할 수 있을까요? if del=empty와 같은 것은 지울 것이 없다는 메시지를 표시합니다. oldlog.txt에서 del=value인 경우 다음을 실행합니다.rclone purge "${dest}/old/${del}"

oldlog="/boot/logs/old-log.txt"
del=
delempty=echo "nothing to purge today"
delvalue=rclone purge "${dest}/old/${del}"

복잡해지지 않고 스크립트에서 이 작업을 수행할 수 있습니까?

답변1

4가지 작업을 수행하려고 합니다. 1) 파일 시작 부분에 줄 삽입, 2) 파일의 특정 줄 읽기, 3) 해당 특정 줄이 존재하지 않으면 조건부 분기, 4) 파일의 특정 줄 삭제 파일.

스트림 편집기 유틸리티를 사용하여 sed이 모든 작업을 수행 할 수 있습니다. 내 답변에서는 GNU를 가정하겠습니다 sed. 그러나 정확한 구문은 다른 버전의 sed.

파일 시작 부분에 줄을 삽입하려면:

sed -i "1i\${date}" ${oldlog}

-i옵션은 sed파일이 그 자리에서 처리되도록 지시합니다. 첫 번째 줄에서만 작동하도록 1지시합니다 . 해당 줄 앞에 삽입하라고 지시합니다 .sedi\sed

행 21을 검색하려면 다음을 수행합니다.

del="$(sed -n 21p "${oldlog}")"

-n자동 모드 로만 설정하므로 sed명시적으로 인쇄되는 내용만 출력됩니다. 21은 줄 번호이고 p인쇄 명령입니다.

21번째 줄이 있는지 확인합니다.

sed -n 21q1 ${oldlog}

sed를 다시 -n자동 모드로 전환하고 2121행을 선택한 다음 qsed에게 종료하라고 지시합니다. 이것이 1종료 코드입니다.

21번째 줄 삭제:

sed -i 21d ${oldlog}

다시 한 번 -i파일을 제자리에서 조작하려면 2121행을 선택하고 d삭제하십시오.

함께 넣어보세요:

sed -i "1i\${date}" ${oldlog}
del="$(sed -n 21p "${oldlog}")"
sed -n 21q1 ${oldlog} || { echo "Deleting ${dest}/old/${del}" && rclone purge "${dest}/old/${del}" && sed -i 21d ${oldlog} }

관련 정보