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
結果が正しいと思われる場合は削除してください。