web-dev-qa-db-ja.com

サブフォルダーを介して数千のファイルを配布する

何十万ものファイルを含むフォルダ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)zshglobbing qualifiersであり、globをさらに修飾します。 n数値並べ替え用、Nは、そのグロブのnullglobオプションをオンにします。つまり、グロブを空に展開します。一致するものがない場合のリスト。

(これを使用すると、それらのディレクトリが事前に存在していなかった場合に備えて、mkdir S_$nをスローすることもできます)。

4

ファイル名にスペースが含まれていない場合:

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n100)

parallelの使用:

ls|parallel -n100 mkdir {#}\;mv {} {#}
7
Lri