80 個のファイルのグループが必要な場合は、名前が並べ替え可能であることを確認するのが最善です。そのため、先行ゼロがよく使用されていました。ファイル名にアンダースコアが 1 つしかなく、名前に改行がないと仮定すると、次のようになります。
SOURCE="/path/to/dir"
TARGET="/path/to/other/directory"
(
cd $SOURCE || exit 1
ls |
sort -t _ -k2,2n |
awk -v target="$TARGET" \
'{ file[n++] = $1
if (n >= 80)
{
printf "cat"
for (i = 0; i < 80; i++)
printf(" %s", file[i]
printf(" >%s/%s.%.2d\n", target, "newfile", ++number)
n = 0
}
END {
if (n > 0)
{
printf "cat"
for (i = 0; i < n; i++)
printf(" %s", file[i]
printf(" >%s/%s.%.2d\n", target, "newfile", ++number)
}
}' |
sh -x
)
2 つのディレクトリが指定されています (ファイルの場所とサマリーの場所)。このコマンドは、ディレクトリをソース ディレクトリ (800 個のファイルがある場所) に変更します。名前を一覧表示し (必要に応じて glob パターンを指定できます)、数値順に並べ替えます。出力はawk
、オンザフライでシェル スクリプトを生成する に渡されます。一度に 80 個の名前を収集し、cat
それらのファイルを .xml などの単一の宛先ファイルにコピーするコマンドを生成し"newfile.01"
ます。printf()
独自の命名/番号付け規則に合わせてコマンドを微調整してください。シェル コマンドは、実行のためにシェルに渡されます。
テスト中は、sh -x
を何も置き換えないか、またはsh -vn
同様のものに置き換えます。必要なことが確実に実行される場合にのみ、アクティブなシェルを追加してください。シェル スクリプトは実行中のソース ディレクトリにあることに注意してください。
表面的には、このxargs
コマンドは使いやすいものです。問題は、出力ファイル番号を調整することです。一度に 80 個のファイルをグループ化するオプションと呼び出し番号を生成するための凝った方法でそれを行う方法があるかもしれませんが、-n 80
私はそれを認識していません。
もう 1 つのオプションはxargs -n
、シェル スクリプトを実行するために使用することです。シェル スクリプトは、ターゲット ディレクトリに既にあるものを一覧表示することにより、正しい出力ファイル番号を推測できます。これは多くの点でよりクリーンになります。
SOURCE="/path/to/dir"
TARGET="/path/to/other/directory"
(
cd $SOURCE || exit 1
ls |
sort -t _ -k2,2n |
xargs -n 80 cpfiles "$TARGET"
)
次cpfiles
のようになります。
TARGET="$1"
shift
if [ $# -gt 0 ]
then
old=$(ls -r newfile.?? | sed -n -e 's/newfile\.//p; 1q')
new=$(printf "%.2d" $((old + 1)))
cat "$@" > "$TARGET/newfile. $new
fi
ゼロ引数のテストは、ゼロ引数xargs
でコマンドを 1 回実行する際の問題を回避します。全体として、私は を使用するソリューションよりもこのソリューションを好みawk
ます。