n個の最新のファイルを特定のディレクトリにコピーする方法は?

n個の最新のファイルを特定のディレクトリにコピーする方法は?

使用

find $dirname -printf "%T@ %Tc %p\n" | sort -n | tail -n 15

以下のディレクトリ構造では、n番目(例ではn = 15)の最新のファイルを見つけることができます$dirname。これで、ファイルをディレクトリにコピー(またはリンク)したいと思います$current。新しく追加されたすべてのファイルを表示するために定期的にバックグラウンドスクリプトを実行したいと思います。

これの背景は、私がrclonems共有ポイントから私のラップトップにディレクトリ構造をミラーリングしてから、$current最近変更されたn個のファイルをすべて表示するディレクトリが欲しかったということです。

ベストアンサー1

次のbashスクリプトを実行してみてくださいcron

#!/bin/bash

# exit on any error
set -e
set -o pipefail

# defaults for the options 
n=15
dirname='/default/path/to/your/files'
current='/default/path/to/the/current/dir'

while getopts ':n:d:c:' opt ; do
  case "$opt" in
    n) n="$OPTARG";;
    d) dirname="$OPTARG";;
    c) current="$OPTARG";;
    :) echo "Error: '-$OPTARG' requires an argument" >&2 ; exit 1 ;;
    *) echo "Error: unknown option '-$OPTARG'" >&2 ; exit 1 ;;
  esac
done

if [ ! -d "$current" ] ; then
  if ! mkdir -p "$current" ; then
    echo "Error: '$current' can't be created or already exists and isn't a directory" >&2
    exit 1
  fi
fi

rm -f "$current"/*
# alternatively, to delete only symlinks in $current:
# find -H "$current/" -maxdepth 1 -type l -delete

find "$dirname/" -type f -printf "%T@\t%p\0" | 
  sort -z -r -n |
  head -z -n "$n" |
  sed -z -e 's/^[^\t]*\t//' |
  xargs -0r readlink -e -z |
  xargs -0r ln -s -t "$current/"

これはファイル名間の区切り文字としてNULを使用するため、有効な文字を含むファイル名で機能します(NULはただパス/ファイル名に無効な文字が含まれています)。

パイプラインのスクリプトはsedタイムスタンプフィールドを削除します(最大および含む)。最初TAB 文字 - TAB はファイル名で有効な文字であるため必要です。sed代わりにここを使用できますcut -z -f2-

私は代わりに少し速いのでsort -r -nandを使用しました。入力全体を読み取る必要がありますが、最初の15個のファイル名を出力してすぐに終了できます。head -ntail -nheadtail

xargs -0r2回使用してください。まず、readlink各ファイル名の完全な標準パスを取得して$currentからln

find注:これには、サポートされているバージョン、サポートされているバージョン、、および、ターゲットディレクトリオプションをサポートするバージョン、およびprintfサポートされているバージョンが必要です。たとえば、これらすべてのGNUバージョンがあります。sortheadreadlinksed-zln-txargs-0

また、他のバージョンの sed では for tab が角かっこ式内で動作するかどうかは覚えていませんが、\tGNU sed では確実に動作します。

Linuxを実行している場合は、coreutils、findutils、sedなどのGNUバージョンのみが必要です。 (GNU以外のバージョンをインストールするなど、本当に奇妙で説明できないクレイジーなことをしない限り)

おすすめ記事