비슷한 질문을 찾아봤지만 제 경우에는 명쾌한 답을 얻기가 어려웠습니다.
저는 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
- 작업하는 동안 에코를 제거합니다.
- null 이 아닌지 확인하는 검사를 추가하는 것이 더 나을 수도 있습니다
$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