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つずつ呼び出されますmv
。mv
in() を構築することで効率を向上させることができます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