Shell-Script
將數千個文件分佈在子文件夾中
我有一個
A
包含數十萬個文件的文件夾。我想將這些文件移動到新的子文件夾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
那個萬用字元)。那些
mv
每個文件呼叫一個。您可以通過製作mv
內置 (zmodload zsh/files
) 來提高效率,或者您可以這樣做:files=(file_*(nN)) for ((n=1; $#files; n++)) { mv -- $files[1,100] S_$n files[1,100]=() }
(nN)
以上是進一步限定 glob的zsh
globbing 限定符。n
是用於數字排序,N
是打開nullglob
那個glob的選項,即當沒有匹配時glob擴展為一個空列表。(有了那個,你甚至可以拋出一個
mkdir S_$n
以防這些目錄事先不存在)。
如果文件名不包含空格:
i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n100)
使用
parallel
:ls|parallel -n100 mkdir {#}\;mv {} {#}