大規模ディレクトリから同時に1000個のファイルを効率的に結合して削除します。

大規模ディレクトリから同時に1000個のファイルを効率的に結合して削除します。

でこれを行うことができることを知っていますcat file [file] [[file] ...] > joined-file。その中に何十万ものファイルがあるディレクトリがあります。複数のグループ(1000個)のファイルを1つのファイルにリンクしたいです。非常に小さなファイルセットがあります。他のサービスがすべてのファイル名を読みやすくメモリに保存して作業できるように、名前と順序に関係なく1000個のファイルをリンクしたいと思います。

私が試したことは次のとおりです。

for i in /var/abc/*.csv; do "$i" > file1.csv; rm -rf "$i"; done

ただし、他の変数の数を追跡してください。効果的な方法は何ですか?これにより、1000個のファイルを直接接続して移動できなくなります。

なぜ1000ですか?ディレクトリには数十万のファイルが含まれているからです。 1つの出力ファイルサイズが制限を超えないように、各ファイルのサイズを1〜4 KBに設定しました。私はあなたの答えに従おうとしました。

cd /var/abc 
for file in $(ls -p | grep -v / | tail -1000); do cat "$file" >>"/var/abcd/xigzag"$tick".csv" && rm -rf "$file"; done

答え1

ループは必要なく、catすべてのファイルを読み取るように指示できます。

cat /var/abc/*.csv > file1.csv && rm /var/abc/*.csv

ファイルがあまりにも多くない限り(ただし、制限は膨大です)。

&&ファイルが正常に「コピー」された場合にのみ削除されるようにするために、2つのコマンド間で使用されます。

ただし、いくつかの注意事項があります。

  • 接続したいソースファイルと同じフォルダではこのコマンドを実行できません。それ以外の場合は、rmセットが削除され、すべてが失われます。
  • catの開始とパラメータ拡張の間に新しいCSVファイルが表示されると、rmそのファイルは削除されコピーされません。
  • 登録後にCSVファイルが変更されると、その修正は失われます。

出力ファイルを作成する前にファイルのリストを保存すると、最初の2つの注意事項を軽減できます。

set -- /var/abc/*.csv
cat -- "$@" > file1.csv && rm -- "$@"

ファイルをコピーした後でも、ファイルへの変更は依然として失われます。

一度に1000個のファイル(1000個のソースCSVごとに1つのCSVが作成されます)と必要な数のファイルをリンクするには、ターゲットディレクトリで次の手順を実行します。

find /var/abc -maxdepth 1 -type f -name \*.csv | split -d -l 1000 - csvlists
for file in csvlists*; do cat $(cat $file) > concat${file##csvlists}.csv && rm $(cat $file); done

/var/abcこれは、名前付きのすべてのファイルを検索し、*.csv(、...)で始まるファイルに一度に1000個のファイルを一覧表示します。次に、各ファイルのリストを繰り返し、リストされたCSVファイルを名前が等しいファイルにリンクしてリストと一致させます。各ファイルセットがコピーされると、元のファイルは削除されます。csvlistscsvlists00csvlists01forconcat00.csv

このバージョンでは、CSVファイル名にスペース、改行などが含まれていないと想定しています。

答え2

あなたの命令はほぼOKです。実際にコンテンツを追加するには、catおよびを追加するだけです。>>

for i in /var/abc/*.csv; do cat "$i" >> file1.csv && rm -rf "$i";done

計算する部分がよく理解できませんね。次のことができます。

let count=0
for i in /var/abc/*.csv; do
  cat "$i" >> file1.csv && rm -rf "$i"
  let count++
done
echo $count files processed.

答え3

そしてzsh

files=(/var/abc/*.csv(N.))
n=0
while (($#files)) {
  cat $files[1,1000] > file$((++n)).csv &&
    rm -f $files[1,1000] || break
  files[1,1000]=()
}

関連情報