Shell-Script

將數千個文件分佈在子文件夾中

  • October 12, 2021

我有一個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 {} {#}

引用自:https://unix.stackexchange.com/questions/63265