3

Как найти последний измененный файл командой "find" в директории и подкаталоге? Мне нужно взять только один файл.

2 ответа2

1

В Linux вы можете использовать

find . -type f -printf "%TY-%Tm-%Td %TT %p\n" | sort | tail -n 1

Это выведет список всех файлов (-type f) и распечатает их с метками времени, затем отсортирует и напечатает только последний.

Если вы не хотите печатать метку времени, вы можете использовать

find . -type f -printf "%TY-%Tm-%Td %TT %p\n" | sort | tail -n 1 | cut -d " " -f 3-
0

Так как сортировка завершается сбоем, если список файлов слишком велик, вот другое решение:

ls -lRU --time-style=long-iso "$PWD"/* | awk 'BEGIN {\
    cont=0; newd=20000101; \
} { \
    gsub(/-/,"",$6); if (substr($0,0,1)=="/") \
    { \
        pat=substr($0,0,length($0)-1)"/"; $6="" \
    }; \
    if( $6 ~ /^[0-9]+$/) { \
        if ( $6 > newd ) { \
            newd=$6; \
            newf=$8; \
            for(i=9; i<=NF; i++) { \
                newf=newf $i; \
            } \
            newf=pat newf; \
        }; \
        count++; \
    } \
} END { \
    print "newest date: ", newd, "\nFile:", newf, "\nTotal compared: ", count \
}' 

Просто вставьте в bash.

Я взял этот код из ответа @ Dr-Beco на Как найти самый старый файл в дереве каталогов и изменил код, чтобы показать НОВЫЙ файл. Для объяснения перейдите по ссылке.

Если вы хотите использовать одну строку, удалите \+ символ новой строки, и вы получите

ls -lRU --time-style=long-iso "$PWD"/* | awk 'BEGIN { cont=0; newd=20000101;} {gsub(/-/,"",$6); if (substr($0,0,1)=="/"){pat=substr($0,0,length($0)-1)"/"; $6=""};if( $6 ~ /^[0-9]+$/) {if ( $6 > newd ) {newd=$6;newf=$8;for(i=9; i<=NF; i++) {newf=newf $i;}newf=pat newf;};count++;}} END {print "newest date: ", newd, "\nFile:", newf, "\nTotal compared: ", count}' 

Не удалось отобразить только даты FILE, а не DIR. Пытался

ls --classify |grep -v /$

который должен просто удалить все каталоги из вывода ls. но это как-то сломало код.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .