使用並行將許多目錄拆分為子目錄

使用並行將許多目錄拆分為子目錄

我想用來parallel將許多目錄拆分為子目錄。例如,我有 1 000 000 個包含內容的目錄,但對於一個目錄來說太多了,所以我想在主目錄中建立 10 個目錄,並在每個目錄中移動 100 000 個原始目錄。

我已經嘗試過ls -tr|parallel -n100000 mkdir "dir_{#}"\;mv {} "dir_{#}"命令,但它只將 ~10 000 移動到一個子目錄中(有時 ~6200,有時 ~12 500)並創建太多子目錄 - 有時比我需要的多 10 倍。當然,我不需要每個子目錄中正好有100 000個目錄,它可以是101 000或98 500個目錄,它應該是100 000範圍內的數字

那麼,我該如何使用 來做到這一點parallel

答案1

GNUparallel解決方案:

parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}' ::: *

  • j N- 職位數。並行運行N作業。在您的情況下,我們將執行 10 個作業來在新的 10 個父目錄之間指派(移動)所有目錄
  • -n100000100000-每個命令列最多使用參數(目錄名)
  • {#}- 要執行的作業的序號。該替換字串將被正在運行的作業的序號替換
  • ::: arguments- 使用arguments命令列作為輸入來源而不是 stdin(標準輸入)

若要處理按修改時間排序的目錄(目錄名稱) - 使用以下管道:

ls -dtr * | parallel -j10 -n100000 --no-notice -k 'mkdir -p dir_{#}; mv {} -t dir_{#}'

相關內容