Вот несколько способов:
sed 's/^[^0-9]*\([0-9]\+\).*/\1/' test
cat test | tr -c '0-9\n' ' ' | while read first rest; do echo $first; done
gawk -F '[^0-9]+' '{print $2}' test # requires non-digits to start line
perl -nE'say/(\d+)/?$1:""' test # code golf
bash:
while read line; do [[ $line =~ [[:digit:]]+ ]] && echo ${BASH_REMATCH[0]} || echo; done
Эта команда также предоставляет последний измененный файл или каталог из текущего дерева каталогов:
% find. -printf '%TY-%Tm-%TdT%TT %p\n' |sort |tail -1
2019-01-30T17:29:18.0330479800./servlet-api/META-INF/NOTICE
Конечно, вы можете изменить последний аргумент на количество самых последних файлов, которые вам могут понадобиться.
Давайте поместим это в кросс--платформенную функцию bash:
# Print N most recently modified files in current dir or below
mrf() {
local _n=${1:-3} # Default to 3
case $OSTYPE in
linux*|msys*)
find. -type f -exec stat -c '%X %n' {} \; | sort -nr | awk -v var="${_n}" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done
;;
darwin*)
find. -type f -exec stat -f '%Dm %N' {} \; | sort -nr | awk -v var="${_n}" 'NR==1,NR==var {print $2}' | while read f; do stat -f '%Sm -- %N' $f; done
;;
esac
}
Использование:
$ mrf
Jan 10 11:50:03 2019 --./somefile
Jan 10 11:44:24 2019 --./nested/dir/file.txt
Jan 10 11:40:50 2019 --./anotherfile
$ mrf 5
Jan 10 11:50:03 2019 --./somefile
Jan 10 11:44:24 2019 --./nested/dir/file.txt
Jan 10 11:40:50 2019 --./anotherfile
Jan 10 06:30:22 2019 --./otherdir/yetanotherfile
Jan 09 10:00:00 2019 --./oldfile
Я использовал упомянутый "mrt" скрипт от Matt Kneiser для некоторых расследований. Затем несколько файлов были показаны по состоянию на 2018 -12 -11. При дальнейших исследованиях я обнаружил, что указанная дата была не датой изменения, а датой доступа. Что касается руководства stat
, правильная строка формата в Linux — это не %X, а %Y для даты последнего изменения вместо даты последнего доступа. Здесь записи руководства по состоянию на 2020 -03 -17 в debian:
%X time of last access, seconds since Epoch
%Y time of last data modification, seconds since Epoch
На мой взгляд, правильный оператор linux в вашем скрипте должен выглядеть так:
find. -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk -v var="${_n}" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done