Если ваша оболочка похожа на оболочку Bourne -и ее [
встроенная функция реализует -nt
тест для проверки того, является ли один файл новее другого, вы можете использовать
newest=
for file in./*./.*; do
if [ -f "$file" ]; then
if [ -z "$newest" ] || [ "$file" -nt "$newest" ]; then
newest=$file
fi
fi
done
if [ -f "$newest" ]; then
printf 'The latest file is "%s"\n' "$newest"
else
echo 'Could not find files here' >&2
exit 1
fi
Это будет перебирать все обычные (и символические ссылки на обычные )файлы (, включая скрытые )файлы в текущем каталоге, а затем сообщать вам, какой файл оказался самым новым. Вы должны заменить оператор printf
фактической командой, которую вы хотите запустить на "$newest"
.
В качестве функции оболочки, которая дополнительно принимает в качестве аргумента список файлов:
newest () (
newest=
for file do
if [ -f "$file" ]; then
if [ -z "$newest" ] || [ "$file" -nt "$newest" ]; then
newest=$file
fi
fi
done
if [ -f "$newest" ]; then
printf '%s\n' "$newest"
else
echo 'No files found' >&2
return 1
fi
)
Тогда
tail -f "$(newest./filename*)"
Я не уверен, как это сделать в sh
, но в bash вы можете сделать это с помощью Замены процесса и tee
, которые должны делать то, что вы хотели
#!/usr/bin/env bash
logfile=logfile.txt
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec > >(tee -a "$logfile") 2>&1 ##: Print to stdout and logfile.