web-dev-qa-db-ja.com

特定のディレクトリにあるファイルのリストから最新のファイルを取得する方法

特定のディレクトリにあるファイルのリストから最新のファイルを取得する必要があります。

スクリプトを初めて実行するとき、特定のディレクトリ内のファイルのリストを別のディレクトリにコピーしました。

2回目の実行から、同じディレクトリ内のファイルのリストから最新のファイルを取得して、それらのファイルを他のディレクトリにコピーする必要があります。

ここで、最初の実行では、最後のファイルの作成日を変数にキャプチャしています。スクリプトが2回目に実行されると、最初の実行の最後のファイル作成日よりも後のファイルです。これらのファイルは他のディレクトリにコピーする必要があります。

誰かが最新のファイルを入手するのを手伝ってくれませんか?

8
Abbireddy
ls -t1 |  head -n 1

前者はすべてのファイルをアクセス時間順に並べて表示し、後者は最初の行を選択します。

22
Thomas Stuefe

変更時刻に基づいて、あるディレクトリから別のディレクトリにファイルをコピーするだけであれば、rsyncを検討することができます。同じことを行う非常に簡単な方法は次のとおりです。

rsync -t ./dir1/ ./dir2/

または、何が追加されるかを確認するだけです。

rsync -t --list-only ./dir1/ ./dir2/

Gillesが以下のコメントで述べているように、-tオプション。しかし、これから何かを取り除く場合は、canおよびshould testを使用して、必要な結果とそのrsync 's --list-onlyオプションは、そのための非常に単純な手段です。

また、多分...

man rsync
4
mikeserv

Zshでは、現在のディレクトリの最新のファイルは

a=(*(om[1]))
latest_file=$a[1]
cp -p $latest_file /other/directory

Glob qualifiers rock、ただし残念ながら、要素を1つだけ要求した場合でも結果はリストなので、一時配列aになります。)

他のシェルでは、ファイル名に改行や印刷できない文字を含めることができないことがわかっている場合は、lsを使用できます。

latest_file=$(ls -t | head -n 1)
cp -p "$latest_file" /other/directory

ただし、実際に求めているのは、特定のファイルよりも新しいファイルのリストであるようです。これには、-cnewerfindの組み込みにより、他のファイルよりもコンテンツまたはメタデータが最近変更されたファイルを検出します。ここでそれを呼び出す方法、findもサブディレクトリにファイルを収集することに注意してください。

find . -cnewer "$previous_latest_files" -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +

問題は、以前の最新のファイルを検出するために残っています...実際、重要なのは、コピーの日付です。したがって、コピーを行うときにマーカーファイルを作成します。

find . -cnewer marker_file -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +
touch marker_file

ファイルがターゲットディレクトリに残っている場合は、2つのディレクトリを同期するだけです。ターゲットディレクトリから古いファイルをいくつか削除しても、それらがソースディレクトリに残っている場合は、この方法で再びコピーされます。

rsync -a . /other/directory/

実際の目的が変更時間に基づいて一連のファイルを移動することであり、システムのfindのバージョンが-newerXYタイプのテストをサポートしている場合は、次のようにすることができます

find -type f -newermt "@$lasttime" -exec mv -t path/to/destination/ {} +

ここで、$lasttimeは、以前に保存したファイル変更時間で、エポックからの秒数です(たとえば、stat -c %Y yourfileから取得したもの)。

参照ファイルのタイムスタンプを変数に保存する代わりに、find -newer somefileまたはfind -newermm somefileを使用して、変更時間を参照ファイルの変更時間と直接比較することもできます。

現在のディレクトリ(サブディレクトリを除く)に選択を制限するには、findコマンドに-maxdepth 1を追加します。

3
steeldriver