파일 이름에 날짜가 포함된 파일을 해당 날짜의 폴더에 복사합니다.

파일 이름에 날짜가 포함된 파일을 해당 날짜의 폴더에 복사합니다.

비슷한 질문을 찾아봤는데 제 경우에는 명쾌한 답을 얻기가 어려웠습니다.

저는 Synology DS1515+와 DSM 6.2.2를 사용합니다.

우선 아래와 같이 스크립트를 이용하여 날짜가 포함된 일일 폴더를 만들었습니다.

mkdir /volume1/video/$(date +%Y-%m-%d\(%a\))

이 스크립트는 매일 자정에 실행됩니다. 그래서 매 자정마다 이런 폴더가 만들어집니다.

(복사하기 전에 항상 대상 폴더가 이미 존재했다는 의미입니다.)

그리고 일부 비디오 파일이 다운로드됩니다. 해당 파일 이름에는 날짜가 포함되어 있습니다.

예: ABCDABCD.200328.avi 또는 EFGHIJKH.200327.1080p.mp4

파일 이름에는 특정 규칙이 없지만 YYMMDD 유형과 같은 날짜가 모든 파일 이름에 포함됩니다.

이 파일을 동일한 날짜가 포함된 폴더에 복사하고 싶습니다.

(위와 같이 자동으로 생성되는 폴더는 제가 설명하겠습니다)


[디렉토리 위치]

복사하고 싶은 파일 경로 : /volume1/video/

대상 디렉토리 예 : /volume1/video/daily/2020-04-06(월)


어떻게 하는지 도와주시거나 설명해 주실 수 있나요?

설명해주시면 위와 같이 제 경우의 디렉토리 경로도 함께 기재해 주시기 바랍니다.

(제게 이해가 부족해서 추천해주신 코드를 적용하지 못해서 죄송합니다.)

다시 한번 감사드립니다. 좋은 하루 보내세요.

답변1

이 시도,

for f in /volume1/video/*; do
  # skip over directories
  [ -f "$f" ] || continue
  # grep the date in YYMMDD format
  date=$(printf '%s' "$f" | grep -Eo '[0-9]{6}')
  # set target path using date to convert YYMMDD to YYYY-MM-DD(%a)
  target="/volume1/video/daily/$(date -d "$date" +%Y-%m-%d\(%a\))/"
  # mv the file
  echo mv "$f" "$target"
done
  • 작동할 때 에코를 제거하십시오.
  • 비어 있지 않은지 확인하기 위해 검사를 추가하는 것이 좋을 수도 있습니다 $date.
  • 누락된 디렉터리에 대한 오류를 방지하려면 mkdir -p "$target"앞에 추가할 수 있습니다 .mv
  • 참고: 이 코드에는 밀레니엄 버그가 있습니다 ;-)

답변2

방금 테스트한 스크립트도 만들었습니다.

#!/bin/bash

SOURCE_FOLDER="video/"
TARGET_FOLDER="video/daily" # Not used as it is under the source folder.

doMove() {
    # Year loop assuming AFTER 2000 up to 2022
    cd "$SOURCE_FOLDER"
    for i in 20{19..20} ; do
        #echo -e "/nWorking on 20$1"
        # Month Loop
        for j in 0{1..9} {10..12} ; do
            # Day Loop
            for k in 0{1..9} {10..31} ; do
                # Find files matching YYMMDD
                file=$(find . -maxdepth 1 -type f -print | grep $i$j$k)
                # For each found file:
                for sf in $file ; do
                    # Find the folder with a different format
                    folder=$(find * -type d -print | grep $i-$j-$k)
                    echo -e "\nFile: $sf"
                    echo -e "Folder: $folder"
                    mv "$sf" "$folder/" # 2> /dev/null
                    echo -e "Moved $sf to $folder"
                done
            done
        done
    done
    cd .. # Change to your needs.
}
doMove

관련 정보