스크립트를 작성하려고 하는데 추가할 마지막 부분에서 막혔습니다.
이 스크립트는 내 서버의 일부 경로를 내 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
지시합니다 . 해당 줄 앞에 삽입하라고 지시합니다 .sed
i\
sed
행 21을 검색하려면 다음을 수행합니다.
del="$(sed -n 21p "${oldlog}")"
-n
자동 모드 로만 설정하므로 sed
명시적으로 인쇄되는 내용만 출력됩니다. 21
은 줄 번호이고 p
인쇄 명령입니다.
21번째 줄이 있는지 확인합니다.
sed -n 21q1 ${oldlog}
sed를 다시 -n
자동 모드로 전환하고 21
21행을 선택한 다음 q
sed에게 종료하라고 지시합니다. 이것이 1
종료 코드입니다.
21번째 줄 삭제:
sed -i 21d ${oldlog}
다시 한 번 -i
파일을 제자리에서 조작하려면 21
21행을 선택하고 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} }