何千ものファイルの中で最も古い 100 個のファイルを選択し、後で検索できるようにそのファイルのリストを作成しながら圧縮します。

何千ものファイルの中で最も古い 100 個のファイルを選択し、後で検索できるようにそのファイルのリストを作成しながら圧縮します。

同じプレフィックスがあるディレクトリ(cdr12345.csz、cdr32342.csv、cdr 98876.csvなど)から最も古い100個のファイルをインポートし、ファイルに保存されている100個のファイルの名前を一覧表示する方法があるかどうかを知りたいです。 .txtを後で読み取り、100個のファイルを圧縮できます。一度に100個しかできませんが、どのようにして最速の100個を最初に取得できますか? zipファイルのサイズは500mgb未満でなければなりません。

答え1

最も古い100ファイルを識別するという点で、次のことができます。

ls -1tr /path/to/directory/cdr* | head -n100 > filelist.txt

1行に1つのファイルをリストし-1(ここでは必ずしも必要ではありません)、変更-t時間に基づいて最新の項目からソートし、-rソート順を逆にします(つまり、最新の項目を最後にリストします)。出力パイプには、head -n100最初の100行(つまり、最も古い100ファイル)が一覧表示されます。その後、出力をfilelist.txt最も古い100個のファイル名を含むファイルにリダイレクトしました。

その後、次を使用してこれらのファイルを圧縮できます。

zip backup -@ < filelist.txt

このオプションは標準入力からファイル名を読み取るように指示し、リダイレクトはファイルのリストを提供しますbackup.zipfilelist.txt-@zip

この程度のテストを行い、要件を満たしていることを確認したら、次のファイルを削除できますfilelist.txt

xargs rm < filelist.txt

これにより、次のものが残ります。

  1. filelist.txt最も古いファイルのリスト
  2. backup.zip最も古いファイルの内容

これは500MBのファイルサイズ制限を解決しません。 1つの方法は、zipファイルを作成した後にサイズを確認し、大きすぎる場合はアーカイブに含まれるファイルの数を減らすことです。

答え2

ファイル名を保存して再分析するのは難しいかもしれませんが、ファイル名にスペースや改行が含まれていない場合は、それほど慎重に処理できません。ファイル名が直接解析されないzshを使用する方法を紹介します。

ファイル名を配列として収集します。

files=( cdr*.csv(om[-100,-1]) )

これはcdr、で始まり終わるファイル名と.csv一致しますがo、変更時間に基づいてファイルを並べ替え、最も古い100を選択するだけです。

次のようなさまざまな方法でファイルに印刷できます。

print -l $files > filelist.txt
printf 'File: %s\n' $files

これらのファイルのzipファイルを生成するには、次の手順を実行します。

zip zipfile $files

...各インスタンスでは、zshは$files変数を各要素に置き換えます。同じ拡張を実行するより慎重な方法は、${files[@]}代替を使用することです。

答え3

注文する

ls -1tr | head -n 100

ディレクトリ内の最も古い100個のファイルのリストが提供されます。

この出力をファイル(zip.inなど)として保存できます。その後、このファイルを使用してzipファイルを作成できます。たとえば、

zip zipfile.zip $(cat zip.in)

zipファイルが500 MB未満である必要がある場合は、個々のファイルの合計サイズを計算して500 MBを超えることを確認できます。しかし、zipはいくつかの圧縮を実行するので、これは正確ではありません。 zipファイルを作成した後にのみわかります。

zip.inリスト内の各ファイルを一度に1つずつzipfile.zipに追加できます。各ファイルを追加したら、zipfile.zipのサイズを確認して500 MBを超えることを確認できます。

関連情報