何十万ものファイルを含むフォルダA
があります。これらのファイルをnewサブフォルダーに移動したいS_i
、たとえば、それぞれに100個のファイルがあります(最後のフォルダーには100個未満のファイルがある場合があります)
言い換えれば、私のフォルダA
に次のものがある場合:
file1
file2
...
file1000
私は後で持っているでしょう:
S_1:
file_1
...
file_100
S_2:
file_101
...
file_200
...
このタスクを実行するためにZshスクリプトを手動で作成する前に(たとえば、変数を使用してファイルをカウントする)、このタスクを容易にするツール( split など)がすぐに利用できるかどうか疑問に思いました。
zsh
の場合:
autoload zmv
zmv 'file_(<->)' 'S_$((1 + ($1 - 1) / 100))'
ファイルに番号が付けられていないが、そのリストを分割したい場合:
n=0; zmv -Q 'file_*(n)' 'S_$((n++/100+1))'
(n)
は、リストの番号順を切り替えることです(そして、そのグロブ修飾子には-Q
が必要です)。
それらはファイルごとに1つのmv
を呼び出します。 mv
を組み込み(zmodload zsh/files
)にすることで、もう少し効率的にすることができます。または、次のようにすることもできます。
files=(file_*(nN))
for ((n=1; $#files; n++)) {
mv -- $files[1,100] S_$n
files[1,100]=()
}
上記の(nN)
はzsh
globbing qualifiersであり、globをさらに修飾します。 n
は数値並べ替え用、N
は、そのグロブのnullglob
オプションをオンにします。つまり、グロブを空に展開します。一致するものがない場合のリスト。
(これを使用すると、それらのディレクトリが事前に存在していなかった場合に備えて、mkdir S_$n
をスローすることもできます)。
ファイル名にスペースが含まれていない場合:
i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n100)
parallel
の使用:
ls|parallel -n100 mkdir {#}\;mv {} {#}