직렬화가 일관성이 없을 때 N개 파일을 모두 복사하는 방법

직렬화가 일관성이 없을 때 N개 파일을 모두 복사하는 방법

img001.jpg에서 img101693.jpg까지 101695개의 파일이 포함된 디렉토리가 있고 100개의 이미지마다 다른 디렉토리로 이동하고 싶습니다. 다음과 같은 비슷한 게시물을 찾았습니다.폴더의 4개 파일을 모두 복사하는 방법하지만 이는 모든 파일의 일련 번호에서 동일한 자릿수를 가정하므로 내 범위는 img000001.jpg로 시작해야 합니다. 이를 수행할 수 있는 방법이 있습니까, 아니면 모두 번호를 갖도록 파일 이름을 수정해야 합니까? 시리즈의 등장인물이 똑같나요?

답변1

dir0000결국 이러한 파일을 100개 그룹으로 나누어 다음 위치에 있는 여러 ... dir1016디렉토리에 분산시키고 싶다고 가정해 보겠습니다 zsh.

files=( img*.jpg(N.n) )
typeset -Z4 n=0
while (( $#files )); do
  mkdir -p dir$n && cp -- $files[1,100] dir$n/
  (( n++ ))
  files[1,100]=()
done

glob n한정자는 파일을 숫자로 정렬합니다. typeset -Z40 패딩은 $n길이 4로 확장됩니다.

zshs 를 사용하면 동시에 비트 수를 복사 하고 수정할 zmv수도 있습니다 .file<n>.jpgdir<n/100>

zmodload zsh/files
mkcp() { mkdir -p -- $2:h && cp -- "$@"; }
autoload -Uz zmv
zmv -Pmkcp -n 'img(<->).jpg' \
              'dir${(l[4][0])$(( $1 / 100 ))}/img${(l[6][0])1}.jpg'

( -n만족하면 삭제(테스트 실행)).

답변2

다음과 같은 더미 파일이 포함된 테스트 디렉터리가 있습니다.

$ ls img*
img0003.jpg  img001.jpg  img013.jpg  img02.jpg  img10.jpg  img12.jpg

사용하자TXR 불분명한 음성2개의 그룹으로 이동하거나 적어도 일련의 디렉토리( dir001, dir002, ...)로 이동하는 것을 시뮬레이션합니다.

$ txr move.tl
move img001.jpg -> dir001
move img02.jpg -> dir001
move img0003.jpg -> dir002
move img10.jpg -> dir002
move img12.jpg -> dir003
move img013.jpg -> dir003

코드는 다음 위치에 있습니다 move.tl.

(defun normalize (path)
  (collect-each ((tok (tok-str path #/\d+/ t))
                 (i 0))
    (if (oddp i) (toint tok) tok)))

(flow
  (glob "img*.jpg")
  (sort @1 : normalize)
  (tuples 2)
  (do each ((tuple @1)
            (dirnum 1))
    (each ((file tuple))
      (put-line `move @file -> dir@(pic "0##" dirnum)`))))

normalize함수는 문자열을 img001.jpg교대 토큰(숫자를 포함하지 않는 토큰과 숫자를 포함하는 토큰)으로 변환합니다. 숫자 토큰은 정수 유형으로 변환됩니다. REPL의 예:

1> (normalize "img001.jpg")
("img" 1 ".jpg")
2> (normalize "123img001.jpg")
("" 123 "img" 1 ".jpg")
3> (normalize "123img001.jpg42")
("" 123 "img" 1 ".jpg" 42 "")

우리는 이 normalize함수를 이름 정렬의 기초로 사용합니다.

4> (glob "img*.jpg")
("img0003.jpg" "img001.jpg" "img013.jpg" "img02.jpg" "img10.jpg"
 "img12.jpg")
5> (sort *4)
("img0003.jpg" "img001.jpg" "img013.jpg" "img02.jpg" "img10.jpg"
 "img12.jpg")

쓸모없는 명령! 소개하자 normalize:

6> [sort *4 : normalize]
("img001.jpg" "img02.jpg" "img0003.jpg" "img10.jpg" "img12.jpg"
 "img013.jpg")

여기서는 원하는 그룹 크기로 그룹화하고 디렉터리로 이동하기만 하면 됩니다. 위 프로그램에서는 print 문을 사용하여 간단히 시뮬레이션했습니다. 다음 수정된 프로그램에서는 실제로 디렉터리가 생성되고 파일이 이동됩니다.

(defun normalize (path)
  (collect-each ((tok (tok-str path #/\d+/ t))
                 (i 0))
    (if (oddp i) (toint tok) tok)))

(flow
  (glob "img*.jpg")
  (sort @1 : normalize)
  (tuples 2)
  (do each ((tuple @1)
            (dirnum 1))
    (each ((file tuple))
      (let ((dirname (pic "dir0##" dirnum)))
        (put-line `move @file -> @dirname`)
        (ensure-dir dirname)
        (rename-path file (path-cat dirname file))))))

달리기:

$ txr move.tl
move img001.jpg -> dir001
move img02.jpg -> dir001
move img0003.jpg -> dir002
move img10.jpg -> dir002
move img12.jpg -> dir003
move img013.jpg -> dir003

$ ls *.jpg
ls: cannot access '*.jpg': No such file or directory

$ ls dir*
dir001:
img001.jpg  img02.jpg

dir002:
img0003.jpg  img10.jpg

dir003:
img013.jpg  img12.jpg

관련 정보