이미지의 하위 디렉터리가 포함된 디렉터리가 있습니다. 새 디렉터리를 만들고 모든 이미지를 그 디렉터리로 옮긴 다음 year/month/day
수정된 순서로 하위 디렉터리로 정렬하고 싶습니다.
find
모든 이미지를 사용하여 새 디렉토리로 옮기고 mv
, 디렉토리에서 첫 번째 이미지의 날짜를 찾고, 해당 이미지의 연도를 따라 이름을 붙인 하위 디렉토리를 만든 다음, 해당 디렉토리에서 같은 연도의 모든 이미지를 찾아 이동하려고 생각했습니다. 나는 디렉토리의 각 이미지에 대해 기본 작업을 수행한 다음 각 하위 디렉토리에 대해 한 달 동안, 그 다음에는 하루 동안 프로세스를 반복할 것입니다.
내 문제는 이를 수행하려면 좀 더 질서 있는 방법이 있어야 한다고 믿는다는 것입니다.
어떤 아이디어가 있나요?
답변1
그리고 zsh
:
zmodload zsh/files # bring in builtin versions of mkdir and mv to speed things up
zmodload zsh/stat
for file (**/*.jpg(N.)) {
zstat -F %Y/%m/%d -A date +mtime -- $file &&
mkdir -p $date &&
mv -- $file $date
}
해당 도구가 없고 zsh
설치할 수 없는 경우 GNU 도구를 사용하여 실행하는 명령 수를 최소화할 수 있습니다.
(export LC_ALL=C
find . -name '*.jpg' -type f -printf '%TY/%Tm/%Td\0%p\0' |
gawk -v 'RS=\0' -v q="'" '
function shquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{
date = $0; getline file
dir[date] = dir[date] " " shquote(file)
}
END {
printf "mkdir -p ."
for (d in dir) printf " %s", d
print " || exit"
for (d in dir) print "mv" dir[d], d
}' | sh
)
| sh
( 요구 사항을 충족하는지 확인하기 위해 먼저 제거 해야 할 수도 있습니다 .)
이들 중 어느 것도 충돌을 방지하지 못합니다. 예를 들어, 가 있고 둘 다 2017-11-01에 마지막으로 수정된 경우 a/foo.jpg
둘 b/foo.jpg
다로 이동되고 2017/11/01/foo.jpg
하나는 다른 하나를 덮어씁니다. 이를 방지하기 -i
위해 플래그를 추가해야 할 수도 있습니다 .mv