
同じプレフィックスがあるディレクトリ(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.zip
。filelist.txt
-@
zip
この程度のテストを行い、要件を満たしていることを確認したら、次のファイルを削除できますfilelist.txt
。
xargs rm < filelist.txt
これにより、次のものが残ります。
filelist.txt
最も古いファイルのリスト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を超えることを確認できます。