
저는 스택 오버플로의 초보자입니다.
당신의 도움이 필요해요. 미리 답변해 주셔서 감사합니다.
비슷한 질문을 찾아봤는데 제 경우에는 명쾌한 답을 얻기가 어려웠습니다.
저는 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 구현도 있다고 가정 )cp
mv
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
옵션을 사용하므로 명령이 자세히 출력되므로 명령이 어떤 작업을 수행했는지 알 수 있습니다.