500,000個のファイルをそれぞれ50,000個のファイルを含む10個のサブディレクトリに展開

500,000個のファイルをそれぞれ50,000個のファイルを含む10個のサブディレクトリに展開

500,000個のファイルがあります.abc。今、それぞれ50,000個のファイルを含む10個の異なるサブディレクトリに展開しようとしています。

私は次のことを試しました

ls -1 | (cd /path/to/folder/1; split --lines=50000).

これにより、50,000の異なる名前を持つxaa、、xab...などのファイルが生成されます。しかし、それらは単なる名前であり、ファイルではありません。xak.abc

答え1

mv `ls *.abc | head -50000` ./subfolder1/

別のサブフォルダ名を使用してこのコマンドを10回実行します。

この10個のサブフォルダ名をどのように指定しますか?コマンドを10回実行する代わりに、forループを使用できます。

説明する

  • ls *.abc | head -50000- 5,00,000個の.abcファイルのうち最初の50,000個のファイルを一覧表示
  • mv <ls part> ./subfolder1/- リストされている50,000個のファイルをすべてsubfolder1というディレクトリに移動します。

答え2

単純なbashシェルループを使用してこれを処理できます。

#!/bin/bash

count=0
for file in *.abc
do
  dir=$(( count / 50000 ))
  (( count++ ))
  [ ! -d "$dir" ] && mkdir "$dir"
  echo mv -- "$file" "$dir"/
done

これは、各ディレクトリに移動するために多くのファイルをハードコードします。ディレクトリ名は0から始まり、徐々に指定されます。

より短い例(一度に20個のファイル10個のみ2個のディレクトリに移動)の出力は次のとおりです。

mv -- 01.abc 0/
mv -- 02.abc 0/
mv -- 03.abc 0/
mv -- 04.abc 0/
mv -- 05.abc 0/
mv -- 06.abc 0/
mv -- 07.abc 0/
mv -- 08.abc 0/
mv -- 09.abc 0/
mv -- 10.abc 0/
mv -- 11.abc 1/
mv -- 12.abc 1/
mv -- 13.abc 1/
mv -- 14.abc 1/
mv -- 15.abc 1/
mv -- 16.abc 1/
mv -- 17.abc 1/
mv -- 18.abc 1/
mv -- 19.abc 1/
mv -- 20.abc 1/

echo結果が正しいと思われる場合は削除してください。

関連情報