Как рекурсивно найти и вывести список последних измененных файлов в каталоге с подкаталогами и временем?

Попытка получить это на мобильном устройстве требует еще нескольких шагов. screen.availWidth остается неизменным независимо от ориентации устройства.

Вот мое решение для мобильных устройств:

function getOrientation(){
    return Math.abs(window.orientation) - 90 == 0 ? "landscape" : "portrait";
};
function getMobileWidth(){
    return getOrientation() == "landscape" ? screen.availHeight : screen.availWidth;
};
function getMobileHeight(){
    return getOrientation() == "landscape" ? screen.availWidth : screen.availHeight;
};
373
задан anubhava 17 November 2016 в 19:36
поделиться

17 ответов

Это можно сделать и с помощью рекурсивной функции в bash.

Пусть F - функция, которая отображает время файла, которое должно быть лексикографически сортируемым, гггг-мм-дд и т. Д. (Зависит от ОС?)

F(){ stat --format %y "$1";}                # Linux
F(){ ls -E "$1"|awk '{print$6" "$7}';}      # SunOS: maybe this could be done easier

R рекурсивная функция, которая запускается через каталоги

R(){ local f;for f in "$1"/*;do [ -d "$f" ]&&R $f||F "$f";done;}

И, наконец,

for f in *;do [ -d "$f" ]&&echo `R "$f"|sort|tail -1`" $f";done
0
ответ дан Nahuel Fouilleul 17 November 2016 в 19:36
поделиться

Это то, что я использую (очень эффективно):

function find_last () { find "${1:-.}" -type f -printf '%TY-%Tm-%Td %TH:%TM %P\n' 2>/dev/null | sort | tail -n "${2:-10}" }

PROS:

  • это порождает только 3 процесса

USAGE :

find_last [dir [number]]

где:

  • dir - каталог для поиска [текущий каталог]
  • number - количество отображаемых новейших файлов [10]

Выход для find_last /etc 4 выглядит следующим образом:

2019-07-09 12:12 cups/printers.conf
2019-07-09 14:20 salt/minion.d/_schedule.conf
2019-07-09 14:31 network/interfaces
2019-07-09 14:41 environment
0
ответ дан Seweryn Niemiec 17 November 2016 в 19:36
поделиться

Для простого вывода ls используйте это. Список аргументов отсутствует, поэтому он не может быть слишком длинным:

find . | while read FILE;do ls -d -l "$FILE";done

И дополнен cut только для даты, времени и имени:

find . | while read FILE;do ls -d -l "$FILE";done | cut --complement -d ' ' -f 1-5

РЕДАКТИРОВАТЬ : только что заметил, что текущий верхний ответ сортируется по дате изменения. Это так же просто для второго примера, поскольку дата модификации указывается первой в каждой строке - добавьте сортировку в конец:

find . | while read FILE;do ls -d -l "$FILE";done | cut --complement -d ' ' -f 1-5 | sort
0
ответ дан Izkata 17 November 2016 в 19:36
поделиться

Вы можете дать команде printf команду find try

% Последнее время доступа к файлу Ak в формате, заданном параметром k, который является либо функцией @' or a directive for the C strftime '. Возможные значения для k перечислены ниже; некоторые из них могут быть доступны не во всех системах из-за различий в strftime между системами.

0
ответ дан graugans 17 November 2016 в 19:36
поделиться

Попробуйте это:

#!/bin/bash
find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head

Запустите его с путем к каталогу, где он должен начать рекурсивное сканирование (он поддерживает имена файлов с пробелами).

Если файлов много, может пройти некоторое время, прежде чем они что-либо вернут. Производительность можно улучшить, если вместо этого использовать xargs:

#!/bin/bash
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head

, что немного быстрее.

439
ответ дан AppleDash 17 November 2016 в 19:36
поделиться

Следующее возвращает вам строку с отметкой времени и именем файла с самой последней отметкой времени:

find $Directory -type f -printf "%TY-%Tm-%Td-%TH-%TM-%TS %p\n" | sed -r 's/([[:digit:]]{2})\.([[:digit:]]{2,})/\1-\2/' |     sort --field-separator='-' -nrk1 -nrk2 -nrk3 -nrk4 -nrk5 -nrk6 -nrk7 | head -n 1

Результатом является вывод вида: <yy-mm-dd-hh-mm-ss.nanosec> <filename>

1
ответ дан mark_infinite 17 November 2016 в 19:36
поделиться

Вот одна версия, которая работает с именами файлов, которые также могут содержать пробелы, символы новой строки, символы глобуса:

find . -type f -printf "%T@ %p\0" | sort -zk1nr
  • find ... -printf печатает изменение файла (значение EPOCH), за которым следует пробел и \0 прекращены имена файлов.
  • sort -zk1nr читает завершенные данные NUL и сортирует их численно в обратном порядке.

Поскольку вопрос помечен Linux, я предполагаю, что доступны gnu утилиты.

Вы можете передать выше с помощью:

xargs -0 printf "%s\n"

, чтобы напечатать время изменения и имена файлов, отсортированные по времени изменения (самое последнее сначала), оканчивающиеся символами новой строки.

1
ответ дан anubhava 17 November 2016 в 19:36
поделиться

Игнорирование скрытых файлов - с nice & amp; быстрая отметка времени

Хорошо обрабатывает пробелы в именах файлов - не то, чтобы вы их использовали!

$ find . -type f -not -path '*/\.*' -printf '%TY.%Tm.%Td %THh%TM %Ta %p\n' |sort -nr |head -n 10

2017.01.28 07h00 Sat ./recent
2017.01.21 10h49 Sat ./hgb
2017.01.16 07h44 Mon ./swx
2017.01.10 18h24 Tue ./update-stations
2017.01.09 10h38 Mon ./stations.json

Подробнее find изобилие можно найти, перейдя по ссылке.

2
ответ дан Serge Stroobandt 17 November 2016 в 19:36
поделиться

Функция быстрого запуска:

# findLatestModifiedFiles(directory, [max=10, [format="%Td %Tb %TY, %TT"]])
function findLatestModifiedFiles() {
    local d="${1:-.}"
    local m="${2:-10}"
    local f="${3:-%Td %Tb %TY, %TT}"

    find "$d" -type f -printf "%T@ :$f %p\n" | sort -nr | cut -d: -f2- | head -n"$m"
}

Найти последний измененный файл в каталоге:

findLatestModifiedFiles "/home/jason/" 1

Вы также можете указать свой собственный формат даты / времени в качестве третьего аргумента.

1
ответ дан Jason Larke 17 November 2016 в 19:36
поделиться

Я показываю это для последнего времени доступа, вы можете легко изменить это, чтобы сделать последнее время мода.

Есть два способа сделать это:


1) Если вы хотите избежать глобальной сортировки, которая может быть дорогой, если у вас есть десятки миллионов файлов, то вы можете сделать: (позиционируйте себя в корне каталога, в котором вы хотите начать поиск)

linux> touch -d @0 /tmp/a;
linux> find . -type f -exec tcsh -f -c test `stat --printf="%X" {}` -gt  `stat --printf="%X" /tmp/a`  ; -exec tcsh -f -c touch -a -r {} /tmp/a ; -print 

Приведенный выше метод печатает имена файлов с постоянно более новым временем доступа, а последний файл, который он печатает, - это файл с самым последним временем доступа. Очевидно, что вы можете получить последнее время доступа, используя «хвост -1».


2) Вы можете найти рекурсивно распечатать имя, время доступа ко всем файлам в вашем подкаталоге, а затем отсортировать по времени доступа и хвосту самую большую запись:

linux> \find . -type f -exec stat --printf="%X  %n\n" {} \; | \sort -n | tail -1

И там у тебя это есть ...

3
ответ дан Sean 17 November 2016 в 19:36
поделиться

Попробуйте

#!/bin/bash
stat --format %y $(ls -t $(find alfa/ -type f) | head -n 1)

. Он использует find для сбора всех файлов из каталога, ls для их сортировки по дате изменения, head для выбора 1-го файла и, наконец, stat чтобы показать время в хорошем формате.

В настоящее время это небезопасно для файлов с пробелами или другими специальными символами в их именах. Напишите комментарий, если он еще не соответствует вашим потребностям.

15
ответ дан Daniel Böhmer 17 November 2016 в 19:36
поделиться

Я сократил удивительный ответ Halo на этот однострочный

stat --printf="%y %n\n" $(ls -tr $(find * -type f))

Обновлен : Если в именах файлов есть пробелы, вы можете использовать эту модификацию

OFS="$IFS";IFS=\n';stat --printf="%y %n\n" $(ls -tr $(find . -type f));IFS="$OFS";
33
ответ дан slashdottir 17 November 2016 в 19:36
поделиться

GNU Find (см. man find) имеет параметр -printf для отображения файлов времени EPOCh и относительного имени пути.

redhat> find . -type f -printf '%T@ %P\n' | sort -n | awk '{print $2}'
38
ответ дан Substantial 17 November 2016 в 19:36
поделиться

Эта команда работает в Mac OS X:

find "$1" -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head

В Linux, как просил оригинальный автор, используйте stat вместо gstat.

Этот ответ, конечно, является выдающимся решением user37078 , переведенным из комментария в полный ответ. Я смешал в понимание CharlesB , чтобы использовать gstat в Mac OS X. Я получил coreutils из MacPorts , а не доморощенного , кстати.

И вот как я упаковал это в простую команду ~/bin/ls-recent.sh для повторного использования:

#!/bin/bash
# ls-recent: list files in a dir tree, most recently modified first
#
# Usage: ls-recent path [-10 | more]
# 
# Where "path" is a path to target directory, "-10" is any arg to pass
# to "head" to limit the number of entries, and "more" is a special arg
# in place of "-10" which calls the pager "more" instead of "head".
if [ "more" = "$2" ]; then
   H=more; N=''
else
   H=head; N=$2
fi

find "$1" -type f -print0 |xargs -0 gstat --format '%Y :%y %n' \
    |sort -nr |cut -d: -f2- |$H $N
10
ответ дан Community 17 November 2016 в 19:36
поделиться

У меня есть этот псевдоним в моем .profile, который я использую довольно часто

$ alias | grep xlogs
xlogs='sudo find . \( -name "*.log" -o -name "*.trc" \) -mtime -1 | sudo xargs ls -ltr --color | less -R'

Так что он делает то, что вы ищете (за исключением того, что он не изменяет дату / время на нескольких уровнях) - выглядит для последних файлов (в данном случае * .log и * .trc); Кроме того, он находит только файлы, измененные в последний день, затем сортирует по времени и передает данные через меньшее:

sudo find . \( -name "*.log" -o -name "*.trc" \) -mtime -1 | sudo xargs ls -ltr --color | less -R

пс. Обратите внимание, что у меня нет root на некоторых серверах, но всегда есть sudo, поэтому вам может не понадобиться эта часть.

3
ответ дан Tagar 17 November 2016 в 19:36
поделиться

Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .

Цитата из поста:

Perl:

find . -type f -print |
perl -l -ne '
    

Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .

Цитата из поста:

Perl:

[110]

Python:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
{

Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .

Цитата из поста:

Perl:

[110]

Python:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
} = -M; # store file age (mtime - now) END { $,="\n"; print sort {

Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .

Цитата из поста:

Perl:

[110]

Python:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
{$b} <=>

Решения perl и Python в этом посте помогли мне решить эту проблему в Mac OS X: https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by -модификация-дата-рекурсивно-но-стат-командной помогло .

Цитата из поста:

Perl:

[110]

Python:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
{$a}} keys %_; # print by decreasing age }'

Python:

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
5
ответ дан Community 17 November 2016 в 19:36
поделиться

Чтобы найти все файлы, состояние файла которых было изменено в последний раз N минут назад:

find -cmin -N

, например:

find -cmin -5

174
ответ дан iman 17 November 2016 в 19:36
поделиться
Другие вопросы по тегам:

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