Список последних измененных файлов в выводе в стиле `ls` без запуска `ls` для всего каталога?

Как описано здесь , вы можете использовать перенаправление execи &>с teeдля захвата стандартного вывода и стандартных ошибок в файл.

Мне интересно, хотите ли вы иметь другой захват для каждой команды (, как можно понять из вашего требования для «каждой команды» и утверждения, что scriptнельзя использовать )или хотите ли вы просто записать весь сеанс в файл журнала.

Если это последнее, то запуск scriptв начале сеанса, а затем реализация всего, что вы сделали внутри, должно работать нормально, но приведенный выше связанный ответ также может помочь. Если вам нужен отдельный файл для каждой команды, вы, вероятно, захотите реализовать что-то, что срабатывает в командной строке -, возможно, путем реализации$PROMPT_COMMAND(man bashдля получения более подробной информации )и замены файла журнала для каждой команды.

Обратите внимание, что поскольку exec &>записывает стандартные потоки в файл, он в основном отключает и приложения TTY (, которые рисуют на экране )при запуске (, например lessили mc). Это будет верно для любого инструмента захвата консоли на уровне оболочки, если только он не выполняет полную эмуляцию TTY (, как это делает script, я полагаю, ).

2
22.07.2019, 19:11
2 ответа

По крайней мере, GNU и FreeBSD findимеют действие -ls, которое производит вывод, аналогичныйls:

$ find. -ls
   392815      4 drwxr-xr-x   2 user  group      4096 Jul 22 18:39.
   392816      0 -rw-r--r--   1 user  group         0 Jul 22 18:39./foo.txt
   392818      0 -rw-r--r--   1 user  group         0 Jul 22 18:39./bar.txt

GNU find также имеет очень настраиваемый вывод в виде действия -printf.

Тем не менее, мне интересно, что делает ваш lsтаким медленным. И find, и lsдолжны прочитать весь каталог и вызвать lstat()для всех файлов, чтобы найти даты, поэтому большой разницы быть не должно. lsнужно сортировать весь список файлов, так что это может иметь значение, если файлов действительно много. В этом случае вы можете рассмотреть возможность распространения файлов по разным каталогам, возможно, в зависимости от их даты. Может помочь удаление -rи использование headвместо tail.

5
27.01.2020, 21:52

Если у вас есть оболочка zsh, она может выполнять часть фильтрации и сортировки дат за вас:

список двух последних файлов:

ls -ld -- *(om[1,2])

(добавьте квалификатор Dglob, чтобы также учитывать скрытые файлы ).

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

ls -ld -- *(om[-2,-1])

Или:

ls -ld -- *(Om[1,2])

список файлов, которые были изменены более 5 дней назад:

ls -ld -- *(m+4)

(как и для find -mtime +4, когда возраст, округленный до числа дней, строго больше 4 ).

список файлов, которые были изменены за последние 5 дней:

ls -ld -- *(m-5)

Все это примеры "Glob Qualifiers" . Оболочка zsh выполняет здесь всю тяжелую работу; он выдает совпадающие имена файлов (, если таковые имеются ), и передает этот список в ls, чтобы он вывел список.

Обратите внимание: если вы хотите ограничить результаты только простыми файлами (, а не каталогами, сокетами, каналами и т. д. ), используйте .;например:

список обычных файлов, которые были изменены за последние 5 дней:

ls -ld -- *(.m-5)
3
27.01.2020, 21:52

Теги

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