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

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

저는 스택 오버플로를 처음 접했습니다.

당신의 도움이 필요해요. 미리 답변해 주셔서 감사합니다.

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

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

먼저 다음과 같은 스크립트를 사용하여 날짜가 포함된 일일 폴더를 만들었습니다.

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

이 스크립트는 매일 자정에 실행됩니다.

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

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

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

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

(자동으로 생성된 폴더의 내용은 위에서 설명한 바와 같습니다)

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

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

답변1

내가 올바르게 이해했다면 GNU로 grep이것을 시도해 볼 수 있습니다 date.

shopt -s nullglob
for file in *.avi *.mp4; do 
  dat=$(echo "$file" | grep -Po "(?<=\.)[0-9]{6}(?=\.)")
  if [[ $(date "+%y%m%d" -d "$dat") ]]; then
    dir=$(date -d "$dat" "+%Y-%m-%d(%a)")
    cp "$file" "$dir"
  fi
done

답변2

gawk한 가지 가능성은 시간 조작 기능이 내장된 GNU Awk()를 사용하는 것입니다 . 예를 들어 (있는 경우 및 GNU 구현 gawk도 있다고 가정 )cpmv

printf '%s\n' *.mp4 *.avi | gawk -F. '
  {
    datespec = sprintf("20%02d %02d %02d 00 00 00", substr($2,1,2), substr($2,3,2), substr($2,5,2)); 
    cmd = sprintf("echo cp -t %s/ -- %s", strftime("%Y-%m-%d\\(%a\\)",mktime(datespec)), $0);
    system(cmd)
  }
'
cp -t 2020-03-29(Sun)/ -- EFGHIJKH.200329.1080p.mp4
cp -t 2020-03-28(Sat)/ -- ABCDABCD.200328.avi

echo올바른 일을 하고 있다고 생각되면 삭제하세요. 복사가 아닌 이동을 원할 경우 로 변경하세요 cp.mv

케이스를 이동하는 또 다른 옵션은 Perl 기반 rename유틸리티를 (남용) 사용하는 것입니다.

$ rename -n -e 'BEGIN{use Time::Piece}' -e 's@^[^.]*[.]([0-9]{6})[.].*$@Time::Piece->strptime($1,"%y%m%d")->strftime("%Y-%m-%d(%a)/") . $_@e' *.mp4 *.avi
rename(EFGHIJKH.200329.1080p.mp4, 2020-03-29(Sun)/EFGHIJKH.200329.1080p.mp4)
rename(ABCDABCD.200328.avi, 2020-03-28(Sat)/ABCDABCD.200328.avi)

여기에서 -n삭제 후 테스트해 보세요.

답변3

cd비디오 파일이 저장된 폴더로 이동 하면 다음 명령을 사용하여 파일을 이동할 수 있습니다.

mv -v *YYMMDD* /path-to-new-folder

이는 패턴 일치를 사용하여 파일 이름에 해당 날짜 형식이 있는 파일만 이동합니다. 저는 일반적 -v으로 명령이 어떤 작업을 수행했는지 알 수 있도록 명령이 자세히 인쇄되도록 이 옵션을 사용합니다.

관련 정보