Как описано здесь , вы можете использовать перенаправление exec
и &>
с tee
для захвата стандартного вывода и стандартных ошибок в файл.
Мне интересно, хотите ли вы иметь другой захват для каждой команды (, как можно понять из вашего требования для «каждой команды» и утверждения, что script
нельзя использовать )или хотите ли вы просто записать весь сеанс в файл журнала.
Если это последнее, то запуск script
в начале сеанса, а затем реализация всего, что вы сделали внутри, должно работать нормально, но приведенный выше связанный ответ также может помочь. Если вам нужен отдельный файл для каждой команды, вы, вероятно, захотите реализовать что-то, что срабатывает в командной строке -, возможно, путем реализации$PROMPT_COMMAND
(man bash
для получения более подробной информации )и замены файла журнала для каждой команды.
Обратите внимание, что поскольку exec &>
записывает стандартные потоки в файл, он в основном отключает и приложения TTY (, которые рисуют на экране )при запуске (, например less
или mc
). Это будет верно для любого инструмента захвата консоли на уровне оболочки, если только он не выполняет полную эмуляцию TTY (, как это делает script
, я полагаю, ).
По крайней мере, 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
.
Если у вас есть оболочка zsh, она может выполнять часть фильтрации и сортировки дат за вас:
ls -ld -- *(om[1,2])
(добавьте квалификатор D
glob, чтобы также учитывать скрытые файлы ).
ls -ld -- *(om[-2,-1])
Или:
ls -ld -- *(Om[1,2])
ls -ld -- *(m+4)
(как и для find -mtime +4
, когда возраст, округленный до числа дней, строго больше 4 ).
ls -ld -- *(m-5)
Все это примеры "Glob Qualifiers" . Оболочка zsh выполняет здесь всю тяжелую работу; он выдает совпадающие имена файлов (, если таковые имеются ), и передает этот список в ls
, чтобы он вывел список.
Обратите внимание: если вы хотите ограничить результаты только простыми файлами (, а не каталогами, сокетами, каналами и т. д. ), используйте .
;например:
ls -ld -- *(.m-5)