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 -Z4
0 パディングは$n
長さ 4 に拡張されます。
zsh
sを使用すると、同時にビット数をコピーして変更することもzmv
できます。file<n>.jpg
dir<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