하위 폴더 구조를 잃지 않고 하위 폴더의 특정 파일 형식을 대상 폴더로 이동

하위 폴더 구조를 잃지 않고 하위 폴더의 특정 파일 형식을 대상 폴더로 이동

우선, Linux에 대한 저의 지식은 매우 제한적이지만 항상 최선을 다합니다. 또한 Cronjob과 스크립트를 사용하여 Unraid Server와 RPi에서 많은 작업을 자동화했지만 지금은 조금 헤매고 있습니다.

다음 상황: icloud 사진 다운로더를 사용하여 icloud 저장소에 있는 모든 사진과 비디오를 로컬 NAS에 자동으로 다운로드하고 있습니다. 하위 폴더 구조 /yyyy/mm/을 사용하고 .jpg 및 .mov를 다운로드합니다. 예를 들어 오늘 촬영한 비디오는 오늘 밤 /2020/12/IMG_0123.mov에 다운로드됩니다.

또한 mkv는 내 모든 장치에서 재생되는 반면 .mov는 항상 Plex 등에서 변환되기를 원하기 때문에 "handbrake"를 사용하여 .mov를 .mkv로 변환합니다. Handbrake의 경우 감시 폴더(/videowatch/)와 출력 폴더(/videooutput/)를 관리했습니다. 이 폴더는 감시 폴더에 복사한 비디오 파일을 자동으로 변환하고 폴더 구조별로 동일한 파일을 다시 만들어 내보낼 때 사용합니다. 출력 폴더. 예: 위에서 언급한 비디오 파일을 하위 폴더 /videowatch/2020/12/IMG_0123.mov에 복사했습니다. 핸드브레이크는 이를 mkv로 트랜스코딩하고 파일을 /videooutput/2020/12/IMG_0123.mkv로 내보냅니다. 그러면 .mov가 삭제됩니다.

이 단계는 현재 수동으로 수행하고 있으며 자동화하고 싶습니다.

이 스크립트를 어떻게 관리할 수 있나요? 다음 단계를 수행해야 합니다.

  1. 모든 하위 폴더에서 .mov 유형의 파일 검색
  2. 발견된 모든 .mov 파일을 /videowatch/ 폴더로 이동하되 하위 폴더 구조를 다시 만듭니다.

예: icloudpd는 /2020/11/ 및 /2020/12/ 폴더에 두 개의 새로운 .mov(file1.mov 및 file2.mov)를 다운로드합니다. 이 두 폴더에는 이미 다른 많은 .jpg 및 .mkv 파일이 저장되어 있습니다.

  1. 스크립트는 두 개의 .mov 파일 /2020/11/file1.mov 및 /2020/12/file2.mov를 인식합니다.
  2. 스크립트는 이 두 파일을 /videowatch/ 폴더로 이동하고 하위 폴더 구조를 다시 만듭니다. 그런 다음 /videowatch/2020/11/file1.mov 및 /videowatch/2020/12/file2.mov를 갖게 됩니다.

그게 가능합니까? 마지막 단계로, videooutput 폴더의 내용을 /로 다시 이동하여 새 mkv 파일을 이전 .mov 파일의 대상 폴더로 이동해야 합니다. 핸드브레이크는 하위 폴더 구조를 유지하므로 crontab의 mv 항목을 통해 쉽게 처리할 수 있습니다.

너무 복잡하게 설명하지 않았으면 좋겠습니다.

당신의 도움을 주셔서 대단히 감사합니다!


.mov 파일을 감시 폴더(폴더 구조 포함)로 이동하는 스크립트를 작성하려고 합니다.

예를 들어 find를 사용하여 파일을 검색할 수 있습니다.

find . -name "*.MOV" -type f 

이는 다음을 제공합니다:

./2008/08/CIMG0035.MOV 
./2010/11/IMG_0212.MOV

그런 다음 이 두 파일을 감시 폴더로 이동하면 다음과 같이 표시됩니다.

./videowatch/2008/08/CIMG0035.MOV
./videowatch/2010/11/IMG_0212.MOV

다른 모든 것(handbrake, icloudpd, cronjob 등)을 직접 처리할 수 있었습니다.

나는 사용할 수 있다

find . -name "*.MOV" -type f -exec mv '{}' /watchfolder/ \;

그러면 find 명령으로 인식된 모든 .MOV가 감시 폴더 기본 폴더로 이동되지만 계층 구조와 하위 폴더는 없습니다. 따라서 해당 폴더에 있는 모든 파일을 연/월별로 나열하지는 않습니다.

./videowatch/CIMG0035.MOV 
./videowatch/IMG_0212.MOV 

하지만 그것은 내가 원하는 것이 아닙니다. 파일이 소스 폴더에 있기 때문에 연도/월 하위 폴더를 포함하기를 원하거나 필요합니다.

감사해요!

답변1

쉘 스크립트를 호출하고 이 문제에 대한 솔루션 중 하나를 사용할 수 있습니다.mv가 존재하지 않는 경우 이동할 디렉토리를 생성하도록 하는 방법이 있습니까?

rsync/를 사용하여 원하는 것을 동기화한 다음 수동으로 삭제할 --include수도 있습니다 .--exclude

또는 find파일 목록을 생성하면 다른 모든 작업을 수행하는 스크립트에서 해당 목록을 읽을 수 있습니다(이제 이동도 수행함). 이런 경우에는 mkdir -p움직이기 전에 하는 것이 효과적입니다.

이동하려는 파일이 완전히 다운로드될 수도 있고 다운로드되지 않을 수도 있다는 점에 유의하세요. 스크립트를 실행할 때 클라우드에서 전송되는지 여부를 알 수 있는 방법이 필요합니다. 이를 수행하는 방법은 다운로드를 수행한 도구에 따라 다릅니다. 숨겨진 파일이 있거나 fuser이동하려는 파일에서 작업하여 찾을 수 있습니다. 그렇지 않으면 데이터가 손실될 위험이 있습니다.

관련 정보