content1_20231110.csv
、content2_20231110.csv
などのさまざまなファイルで毎日満たされるフォルダがあります。私が管理できない理由から、このフォルダには1年の記録と何千ものファイルが保存されています。
現在、このフォルダから別の共有ドライブに毎日ファイルを手動でコピーしています。ファイルエクスプローラを使用すると、変更した日付で並べ替えることができ、必要なすべてのファイルをまとめることができるので、これは非常に簡単でした。ファイルは一晩作成されるため、変更日だけでなく、ファイル名の日付で必要なファイルを識別する必要があります。
これを自動化するためにbashシェルスクリプトを作成しました。主な方法は、名前の日付に基づいてファイルを識別し、次のコマンドを使用してファイルをコピーすることです。
cp $originalFolderMapping/*$targetDate* $destinationFolderMapping
私が望むファイルが自分のフォルダに分離されている場合はうまくいきます(テストのためにこれを行いました)。しかし、ソートされていない元のフォルダを検索するのにかなり時間がかかります。共有ドライブのファイル速度も遅くなる可能性があります。
ファイルエクスプローラで変更された日付で並べ替えると、すばやく簡単に並べ替えることができます。これをすばやく実行するためにシェルスクリプトで同様のことを行う方法はありますか?よろしくお願いします。
答え1
ファイルエクスプローラへの言及を見ると、あなたがWindowsを使用しているのか、おそらくbashがcygwinで実行されているのだろうか?この場合、cygwin中間層はすでに比較的遅いNTFSファイルシステムをはるかに遅く見せることができます。
Chris Daviesが指摘したように、ファイルシステムがネットワーク共有にある場合、「cp」のglob(ファイルパス拡張)ははるかに遅くなります。
試すことができる1つのオプション(動作しない可能性があります)は、ディレクトリ全体のリスト(例ls -1 $dir >/tmp/file
: 。ファイルが一晩作成されたことを考慮すると、リストファイルは非常にまれに更新される必要があるため、ファイルがどれだけ最新であるか、現在のタスクを更新する必要があるかどうかを追跡することをお勧めします。
「cp」を使用しているため、ファイルは削除されませんが、新しいファイルが追加されるため、時間が経つにつれて問題がさらに悪化することがわかりました。最新のファイルシステムは通常、以前のファイルシステムよりはるかに優れていますが、非常に大きなディレクトリで作業すると、常にルックアップコストが発生します。 NTFSおよび他のファイルシステムはハッシュされたディレクトリ構造を使用します。つまり、特定のファイル名を検索する方が、あらゆる種類の検索よりもはるかに高速です。
したがって、2 番目のタスクとして、このフォルダの構成ヘルパータスクを使用して、年ごと、週別など、あらゆる方法で分割できます。あなたが持っているものは持続不可能であり、さまざまな種類のエラーが発生しやすいです。