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

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

저는 스택 오버플로의 초보자입니다.

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

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

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

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

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

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

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

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

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

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

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

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

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

답변1

grep내가 당신의 말을 올바르게 이해했다면, GNU 로 이것을 시도해 볼 수 있습니다 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()를 사용하는 것입니다 . 예를 들어 ( 가 있는 경우 및 gawk의 GNU 구현도 있다고 가정 )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유틸리티를 (ab) 사용하는 것입니다.

$ 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옵션을 사용하므로 명령이 자세히 출력되므로 명령이 어떤 작업을 수행했는지 알 수 있습니다.

관련 정보