다른 파일의 생성 날짜를 기준으로 파일을 삭제하는 방법은 무엇입니까?

다른 파일의 생성 날짜를 기준으로 파일을 삭제하는 방법은 무엇입니까?

나는감시 장치Linux(busybox 1.32.0)를 실행하면 폴더 구조에서 30초 블록(구성 가능)으로 연속적으로 비디오를 녹화하도록 설정할 수 있습니다.

recording/2022/04/26/15/2022-04-26-15-30-00.mp4

다른 폴더에서는 움직임이 감지될 때만 정지 이미지를 녹화합니다.

stills/2022/04/26/15/2022-04-26-15-30-05.jpg

다음은 모션이 감지되기 ​​전에 비디오를 얻기 위해 고안한 해결 방법입니다.

사용 가능한 공간이 제한되어 있으므로 이동 전 60초 이상, 이동 후 120초 이상부터의 모든 동영상을 삭제하여 각 정지 이미지에 대한 전후 동영상을 일부 유지하고 싶습니다.

정적 이미지의 빈도는 미리 정의된 간격이 아닌 모션 트리거를 기반으로 하기 때문에 5초마다 높을 수 있습니다.

물론, 단일 이미지의 경우 다음과 같이 "찾기"를 실행하세요.적합한옵션이 있지만 더 복잡한 사용 사례는 어떻습니까?

몇 가지 가능한 접근 방식을 고려했지만 진행 방법을 모르겠습니다.

전날의 요소(녹화 및 스틸)를 나열하는 스크립트를 매일 실행하여 변환하는 것에 대해 생각했습니다.파일 이름에서 타임스탬프까지그런 다음 각각의 타임스탬프를 정지 이미지의 타임스탬프와 반복적으로 비교합니다.

여기에는 4개의 목록(파일 이름, 타임스탬프, 녹음 및 스틸)이 포함되는데, 이는 상당히 복잡해 보입니다(아마도 쉘 스크립트에 익숙하지 않기 때문일 것입니다). 이 작업을 수행하는 더 쉬운 방법이 있습니까?

Python 또는 Perl과 관련된 솔루션은 플랫폼에 맞게 컴파일해야 하며 장치의 사용 가능한 공간이 이미 제한되어 있고 Samba 4.x 실행 파일이 더 이상 적합하지 않다는 것은 말할 것도 없고 CPU에 과도한 로드를 가할 가능성이 높습니다.

사용 가능한 도구는 사용 가능한 도구입니다.비지박스의 일부게다가 나열된 바이너리프로젝트 웹사이트.

답변1

시간 개념을 전혀 사용하지 않고 파일 이름에 의존하여 알파벳순으로 정렬하는 것은 시간순으로 정렬하는 것과 같습니다.

첫 번째 단계:

$ busybox sh
$ target="/2022/04/26"
$ busybox find recording/"$target" stills/"$target" -type f | busybox sort -t/ -k6 |\
busybox grep -B2 -A4 'jpg$' | busybox grep 'mp4$' > keep.txt

일정 기간 동안 녹화 및 정지 이미지를 가져옵니다 find. sort매개변수는 파일 이름입니다. 이제 사진과 비디오가 시간별로 정렬됩니다. grep사진의 경우 재생 전후에 줄을 유지하고(원하는 양을 확인하려면 -B, -A 사용) 마지막에 유지하려는 녹음만 유지하세요.

첫 번째 출력의 중간 출력은 grep다음과 같습니다(처음 2, 마지막 4).

recording/2022/04/26/15/2022-04-26-15-31-30.mp4
recording/2022/04/26/15/2022-04-26-15-32-00.mp4
stills/2022/04/26/15/2022-04-26-15-32-05.jpg
recording/2022/04/26/15/2022-04-26-15-32-30.mp4
recording/2022/04/26/15/2022-04-26-15-33-00.mp4
recording/2022/04/26/15/2022-04-26-15-33-30.mp4
recording/2022/04/26/15/2022-04-26-15-34-00.mp4
--
recording/2022/04/26/15/2022-04-26-15-36-30.mp4
recording/2022/04/26/15/2022-04-26-15-37-00.mp4
stills/2022/04/26/15/2022-04-26-15-37-29.jpg
recording/2022/04/26/15/2022-04-26-15-37-30.mp4
stills/2022/04/26/15/2022-04-26-15-37-34.jpg
recording/2022/04/26/15/2022-04-26-15-38-00.mp4
recording/2022/04/26/15/2022-04-26-15-38-30.mp4
recording/2022/04/26/15/2022-04-26-15-39-00.mp4
recording/2022/04/26/15/2022-04-26-15-39-30.mp4

2단계:

$ busybox find recording/"$target" -type f | busybox grep -vf keep.txt | busybox xargs echo rm

녹음에서 보관하려는 파일을 제외하고 나머지 파일을 삭제하세요.


노트:

파일 이름은 공백이나 특수 문자 없이 단순해야 합니다. 귀하의 비지박스에 더 많은 옵션이 작동할지 모르겠습니다. 명령을 설치하고 실행한 버전 1.34의 경우 -print0find 및 -zsort가 있지만 grep이나 xargs는 없습니다 -0.

또한 목표 기간 동안 모든 녹음이 존재한다고 가정합니다. 그러나 그렇지 않더라도 우리는 유용한 청크를 제거하지 않을 것이며 최악의 경우 더 많은 청크를 유지할 수 있습니다. 예를 들어 정지 이미지 주위에 비디오가 없는 경우 언제 나타나는지에 관계없이 더 가까운 청크를 유지합니다.

답변2

쉘 스크립트를 사용하면 확실히 가능하지만 Python을 사용하면 더 쉽습니다. 디렉토리에 있는 모든 파일을 가져올 수 있는 Python의 os 모듈을 확인해 보세요.

그런 다음 파일 이름을 정규식과 비교하고 원하지 않는 파일을 삭제하기만 하면 됩니다.

관련 정보