Найти последние файлы

Вот несколько способов:

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
8
03.11.2015, 16:02
3 ответа

Эта команда также предоставляет последний измененный файл или каталог из текущего дерева каталогов:

% find. -printf '%TY-%Tm-%TdT%TT %p\n' |sort |tail -1
2019-01-30T17:29:18.0330479800./servlet-api/META-INF/NOTICE

Конечно, вы можете изменить последний аргумент на количество самых последних файлов, которые вам могут понадобиться.

6
27.01.2020, 20:09

Давайте поместим это в кросс--платформенную функцию 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
0
27.01.2020, 20:09

Я использовал упомянутый "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
0
17.03.2020, 07:34

Теги

Похожие вопросы