でこれを行うことができることを知っています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ファイルを名前が等しいファイルにリンクしてリストと一致させます。各ファイルセットがコピーされると、元のファイルは削除されます。csvlists
csvlists00
csvlists01
for
concat00.csv
このバージョンでは、CSVファイル名にスペース、改行などが含まれていないと想定しています。