20,000個のファイルをディレクトリから順次移動するなどの作業

20,000個のファイルをディレクトリから順次移動するなどの作業

私が達成しようとしているのは、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 -zsplit --separator '\0'xargs -0

関連情報