날짜별로 이미지를 하위 디렉터리로 정렬

날짜별로 이미지를 하위 디렉터리로 정렬

이미지의 하위 디렉터리가 포함된 디렉터리가 있습니다. 새 디렉터리를 만들고 모든 이미지를 그 디렉터리로 옮긴 다음 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.jpgb/foo.jpg다로 이동되고 2017/11/01/foo.jpg하나는 다른 하나를 덮어씁니다. 이를 방지하기 -i위해 플래그를 추가해야 할 수도 있습니다 .mv

관련 정보