私が達成しようとしているのは、176,000ファイルのディレクトリを持つことです。スクリプトでは、176,000個のファイルをそれぞれ20,000個のファイルを含むフォルダに分割し、最後のフォルダに奇妙な空白が含まれるようにします。ファイルを順番にコピーして英数字順に保存したいと思います。これが私が現在持っているものですが、何かが欠けているようです。作成された最初の2つのフォルダは順序が正しくありませんが、生成された他の3つのフォルダは連続しています。
結論は、フォルダに176,000のファイルが含まれていることです。スクリプトは、最初の20,000個のファイルを「split」というフォルダに移動し、次に20,000個のファイルをインポートするように分割2、分割3などを生成します。
これが私が持っているものです:
#!/bin/bash
dir_size=20000
dir_name="split"
n=$((`find . -maxdepth 1 -type f | wc -l`/$dir_size+1))
for i in `seq 1 $n`;
do
mkdir -p "$dir_name$i";
find . -maxdepth 1 -type f | sort -n -z | head -n $dir_size | xargs -i mv "{}" "$dir_name$i"
done
答え1
- ファイルを一覧表示し(使用できないか、これを行うと176000個の引数を持つコマンドラインが生成されるため
ls *
)ls*.dpx
このls
リストを(splitが標準入力を処理するように指示する唯一の方法)を使用してsplit
チャンク(名前files.01
、...ファイル)に分割します。files.02
-
ls | split -d --lines 20000 - files.
find
より厳密なフィルタリングのために、前と同様にソートsplit
後に出力をパイピングする方法を使用することもできます。
find . type f | sort | split -d --lines 20000 - files.
files.*
数値部分を使用してディレクトリ名を作成し、ファイルを移動して繰り返し生成します。
for f in files.* # iterate the files.*
do
dirname="/path/to/dir${f#*.}" # generate directory name from numeric suffix
mkdir -p "$dirname" # create the directory
xargs mv -t "$dirname" < $f # move the files
done
警告:テストされていません。まず、小さなサンプルを試してみてください。
ファイル名にスペースが含まれている場合は、とを使用してfind -print0
くださいsort -z
。split --separator '\0'
xargs -0