Я работаю над LRU-скриптом, но после 20 часов работы над ним у меня возникла проблема с рекурсивным режимом, которую я не могу исправить.
Мне просто нужна команда, которая покажет мне файлы, отсортированные по времени доступа (--time=atime); я также хочу управлять глубиной, но если я не могу этого сделать, то это тоже нормально.
- Основной каталог:
- Файл 1
- Каталог 1:
- Файл 1
- Файл2
- Подкаталог 1:
- файл1
- файл 2
- Каталог 2:
- Файл 1
- Файл 2
- Подкаталог 2:
- файл 1
- файл 2
- подкаталог 3:
- файл 1
Я хочу исключить каталог, просто отсортировав файлы по времени доступа
нравиться
/Главный каталог/Каталог 1/файл 1
/Главный каталог/Файл 1
/Главный каталог/Каталог 1/Подкаталог 1/файл 2
/Главный каталог/Каталог 2/Подкаталог 2/подкаталог 3/файл 1
и т. д..
решение1
Существует шесть наиболее часто используемых инструментов для решения подобных проблем:
find
, для поиска файлов или каталогов, соответствующих определенным записям.Параметры
-mindepth
и-maxdepth
управляют глубиной расположения команды в дереве файловой системы (относительно указанных имен, которые всегда находятся на глубине 0).Эта
-type
опция полезна для ограничения рассмотрения файлов, каталогов, символических ссылок или устройств.Эта
-printf
опция чрезвычайно полезна, так как она заставляет команду выводить информацию о совпадающих именах (элементах каталога) в нужном формате. Мне особенно нравится%TY%Tm%Td %TT %p\n
, которая выводит дату и время последнего изменения, а также полный путь и имя каждого совпадения в каждой строке, используя formatYYYYMMDD HH:MM:SS.sss PATH
. Видите ли, этот формат сортирует правильно. Для последнего доступа используйте%AY%Am%Ad %AT %p\n
, но обратите внимание, что временные метки доступа вообще не записываются, еслиnoatime
используется опция монтирования, или, еслиrelatime
используется опция монтирования, временные метки доступа изменяются только для первого доступа после изменения; таким образом, проверка на наименее давно используемые ненадежна. (Однако список наименее недавно измененных довольно надежен; пользователи могут изменять временные метки вручную, но в противном случае они поддерживаются автоматически.)sort
для сортировки вывода.Параметры
-d
,-g
,-h
,-M
и-n
определяют, как сравниваются элементы, а-R
параметр делает порядок случайным.Эту
-r
опцию можно использовать для изменения порядка сортировки на обратный (используется в дополнение к одной из вышеперечисленных опций).Эта
-t
опция переопределяет способ определения полей (столбцов); по умолчанию столбцы разделяются пробелами (пробелами и табуляциями).Эту
-k
опцию можно использовать для определения того, какая часть каждой строки считается ключом сортировки; по умолчанию рассматривается вся строка.uniq
часто используется после сортировки для объединения нескольких последовательных элементов в один, чтобы выводить только уникальные строки.cut
— это самый простой способ выбрать только определенные столбцы из каждой строки вывода.Параметр
-f
выбирает поля для печати. (По умолчанию печатаются строки, содержащие не более одного поля (без разделителей); параметр-s
подавляет печать таких строк.)Эту
-d
опцию можно использовать для переопределения определения поля; по умолчанию отдельные поля очищаются.sed
мощный редактор потоков, который применяетсяобычные выраженияк входным данным, фильтруя и изменяя их по мере необходимости.awk
это интерпретатор языка awk. Скрипты awk в основном представляют собой наборыдействия, фрагменты кода, которые выполняются для каждой строки (или до, или после всей обработки, или если строка (или запись) соответствует некоторому правилу).
Эту конкретную проблему можно решить с помощью трех из приведенных выше команд в простом конвейере: использовать find
для поиска файлов на нужной глубине дерева, выводя сортируемую дату и время для каждого файла, а также относительный путь к файлу; отсортировать вывод; удалить часть даты и времени из каждой строки, оставив только относительный путь к каждому файлу в каждой строке.
решение2
Самый простой способ — использоватьзш. Егоквалификаторы globможет сопоставлять и сортировать файлы по их типу, временным меткам и другим свойствам.
print -lr -- *(.Doa)
print -lr -- **/*(.Doa)
Первая команда выводит имена обычных файлов ( .
) в текущем каталоге, включая файлы с точкой ( D
), отсортированные по времени доступа ( oa
). Вторая команда рекурсивно выводит список файлов в текущем каталоге и его подкаталогах.