使用
find $dirname -printf "%T@ %Tc %p\n" | sort -n | tail -n 15
以下のディレクトリ構造では、n番目(例ではn = 15)の最新のファイルを見つけることができます$dirname
。これで、ファイルをディレクトリにコピー(またはリンク)したいと思います$current
。新しく追加されたすべてのファイルを表示するために定期的にバックグラウンドスクリプトを実行したいと思います。
これの背景は、私がrclone
ms共有ポイントから私のラップトップにディレクトリ構造をミラーリングしてから、$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 -n
andを使用しました。入力全体を読み取る必要がありますが、最初の15個のファイル名を出力してすぐに終了できます。head -n
tail -n
head
tail
xargs -0r
2回使用してください。まず、readlink
各ファイル名の完全な標準パスを取得して$current
からln
。
find
注:これには、サポートされているバージョン、サポートされているバージョン、、および、ターゲットディレクトリオプションをサポートするバージョン、およびprintf
サポートされているバージョンが必要です。たとえば、これらすべてのGNUバージョンがあります。sort
head
readlink
sed
-z
ln
-t
xargs
-0
また、他のバージョンの sed では for tab が角かっこ式内で動作するかどうかは覚えていませんが、\t
GNU sed では確実に動作します。
Linuxを実行している場合は、coreutils、findutils、sedなどのGNUバージョンのみが必要です。 (GNU以外のバージョンをインストールするなど、本当に奇妙で説明できないクレイジーなことをしない限り)