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

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

A数十万のファイルを含むフォルダがあります。これらのファイルを次に移動したいと思います。新しいサブフォルダS_i、例:それぞれ100個のファイル(最後のフォルダには100個未満のファイルがあります)

つまり、私のフォルダに次のものがAある場合:

file1
file2
...
file1000

これから私は次のようになります:

S_1:    
    file_1
    ...
    file_100    
S_2:
    file_101
    ...
    file_200
...

これを行うには、Zshスクリプトを手動で作成する前に(たとえば、変数を使用してファイル数を計算する)、事前に作成されたツール(例:分ける)この作業に役立ちます。

答え1

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

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

使用parallel:

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

答え2

そしてzsh

autoload zmv
zmv 'file_(<->)' 'S_$((1 + ($1 - 1) / 100))'

ファイルに番号が付けられていないがリストを分割したい場合:

n=0; zmv -Q 'file_*(n)' 'S_$((n++/100+1))'

(n)トグルリストの番号順です(-Qワイルドカード修飾子が必要です)。

ファイルごとに1つずつ呼び出されますmvmvin() を構築することで効率を向上させることができますzmodload zsh/files。または、次のようにすることもできます。

files=(file_*(nN))
for ((n=1; $#files; n++)) {
  mv -- $files[1,100] S_$n
  files[1,100]=()
}

上記(nN)zsh ワイルドカード修飾子これは地球をさらに制限します。nある数値ソートはglobをオンにするオプションNで、一致する項目がない場合にglobを空のリストに拡張します。nullglob

(これにより、mkdir S_$n辞書にそのディレクトリが存在しない場合はディレクトリを追加することもできます。)

答え3

dirsplitというLinuxユーティリティがあります。https://linux.die.net/man/1/dirsplit

関連情報