저는 스택 오버플로를 처음 접했습니다.
당신의 도움이 필요해요. 미리 답변해 주셔서 감사합니다.
비슷한 질문을 찾아봤지만 제 경우에는 명쾌한 답을 얻기가 어려웠습니다.
저는 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
도 있다고 가정 )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
유틸리티를 (남용) 사용하는 것입니다.
$ 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
으로 명령이 어떤 작업을 수행했는지 알 수 있도록 명령이 자세히 인쇄되도록 이 옵션을 사용합니다.