シリアライゼーションが一貫性がない場合に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

globn修飾子はファイルを数値でソートします。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

関連情報