Возможно ли на выходе find … -exec ls -ls ;
отсортировать по алфавиту, по имени файла?
Это моя команда cron:
find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;
Эта команда работает нормально, по большей части. Но результаты не сортируются в какой-либо значимой последовательности. Было бы очень полезно, если бы они были отсортированы по полю имени файла.
ls -ls **/*(.)
ls
сортировал бы.Ответы:
Я предполагаю, что имена ваших файлов не содержат символов новой строки.
Использование
+
вместо;
завершения-exec
действия ускоряет его, объединяя вызовыls
. Вы можете сортировать, пропуская черезsort
команду; скажите ему начать сортировку с 10-го поля (первые 9 - это метаданные: блоки, разрешения, количество ссылок, пользователь, группа, размер и 3 поля даты / времени). Опция-n
предписываетls
использовать числовые значения для пользователя и группы, что позволяет избежать риска имен пользователей или групп, содержащих пробелы.В качестве альтернативы, с zsh вы можете без каких-либо допущений обойтись без имени, используя квалификаторы glob для сбора и сортировки файлов и многократного
zargs
запуска,ls
если командная строка будет слишком длинной. Вам нужен GNUls
(в частности, его-f
опция), чтобы избежать повторной сортировкиls
(другой подход - эмулироватьls
с помощью zshzstat
).источник
Почему бы не передать результат поиска через сортировку, а затем выполнить ls для каждой из строк?
источник
У POSIX есть это, чтобы сказать о датах в
ls
-l
списке ong:Принимая это во внимание и гарантируя, что если в имени файла есть какие-либо символы новой строки, они будут правильно добавлены в
ls -q
опцию, указанную также в POSIX , подготовить регулярное выражение дляls
результата сравнительно легкоfind
:grep
для этого вы будете возвращать только те строки, которые содержат строки, представляющие либо сегодняшние, либо вчерашние даты. Следующая команда добавляет к этому немного:ls
варианты состоят из:-a
вернуть все файлы в каталоге, включая те, которые начинаются с.dot
-l
длинный список-R
рекурсивный список всех дочерних каталогов-c
отображать время модификации, а не время доступа-q
возвращать глобус оболочки?
вместо непечатных или\t
ab символов в имени файлаЭти результаты передаются по
|pipe
файлу,sed
которому соответствуют только:-
(другими словами - неd
для каталога), которые также содержат вашиdate
.Вывод выглядит так:
Да, это даже работает с
LS_COLORS
- что, вероятно, является низким приоритетом для васcron
, но, эй, ваши варианты открыты.В любом случае это дает некоторые существенные преимущества перед некоторыми другими возможными решениями.
Во-первых,
find
+ls
включает в себя несколько вызовов - это включает только одинls
процесс, и именно поэтому он способен надежно сортировать все - что он делает по умолчанию - и такsort
также становится вспомогательным.Любое решение , содержащее
find
иsort
иls
в значительной степени делает все работы в два раза.ls
иfind
будет разрешать каждый путь иstat
каждый файл.ls
иsort
оба будут сортировать все результаты. Лучше всего вместо этого использоватьls
.Тогда, конечно, есть
date
иsed
части этого ответа. Важно отметить, что вы выполняете сложную часть и получаете сначала регулярное выражение - и только один раз - а потом вы только сокращаете один список результатов, а не говорите, получаете результаты, получаете результаты, сортируете результаты и сортируете результаты.Это не нарушает имена файлов, содержащие символы новой строки, как, вероятно, будут другие решения. Это решение имеет свои собственные предостережения, которые я объясню далее, но они незначительны и легко обрабатываются. На мой взгляд, это самое надежное решение здесь.
В двух случаях приведенная выше команда может вызвать проблемы. Первый включает
?
глобусы в именах файлов - хотя это уже более надежное решение, чем любое другое, предлагаемое здесь, и вероятность того, что вы столкнетесь с чем-либо, сама?
по себе достаточно мала, но существует вероятность, что эти глобусы будут разрешены. может соответствовать более одного имени файла. Пожалуйста, посмотрите это для получения дополнительной информации по этому вопросу.Другая возможность связана с ложным срабатыванием - например, если у вас есть имя файла, фактически совпадающее со
date
строкой, по которой мы ищем,grep
но которое на самом деле не было изменено ни в один из этих дней. Я не рассчитываю на то, что это проблема, но, если это так, спросите об этом, и я, вероятно, могу помочь вам сделать регулярное выражение более конкретным, чтобы справиться с этим.источник
Вы можете использовать комбинацию find, xargs и ls.
Вот пример команды:
find . -type f -print0 | xargs -0 ls -lt
find
будет рекурсивно искать все файлы в текущем каталоге.ls
команде за один вызов (при условии, чтоfind
возвращается меньшеARG_MAX
файлов).ls -lt
отсортирует эти файлы по времени и отформатирует выводЧтобы получить вашу систему,
ARG_MAX
вы можете набрать:источник
источник
ls
выполняет свою собственную сортировку, поэтому вывод результатовfind
сквозной передачиsort
бесполезен. Кроме того, ваша команда изменяет имена файлов, содержащие пробелы (среди прочих), и завершится ошибкой, если слишком много имен файлов.