Предположим, у меня есть 3 папки в разных каталогах, некоторые из них содержат еще несколько подпапок, и в каждой папке/подпапке у меня есть текстовые файлы с именами test1
, test2
, test3
и т. д., которые содержат строку hello
каким-то образом. Это может быть просто hello
, это может быть helloJASKFNASKFN
и т. д.
Как мне отобразить отсортированный список этих файлов? Допустим, я хочу отсортировать по их именам или по дате изменения. Я понимаю, что могу использовать команду grep
или find
для поиска и отображения этих файлов, но я не уверен, как отобразить их в отсортированном виде.
решение1
Будет проще, если вы сначала отсортируете список файлов, прежде чем передавать его в grep
:
В zsh
, вы можете сделать:
grep -le hello -- **/test<->(.)
Которая ищет hello
содержимое файлов, за именем которых test
следует одна или несколько десятичных цифр ( <->
являющихся формой шаблона <x-y>
для сопоставления диапазонов чисел), в текущем рабочем каталоге или ниже, пропуская скрытые каталоги.
Расширения глобусов по умолчанию сортируются по имени.
Для сортировки по времени изменения используйте (.om)
вместо (.)
. или (.oL)
по размеру. info zsh qualifiers
Список квалификаторов glob и список критериев, o
по которым квалификатор может сортировать, см.
Замените o
на O
, чтобы изменить порядок на обратный ( On
для сортировки в обратном порядке по имени).
Используйте (.n)
для сортировки по имени, чтобы она была числовой ( test10
следовала за , а не test9
между ).test1
test2
Если вы столкнетесь сСлишком много доводовошибка (вызванная ограничением системного execve()
вызова большинства систем):
autoload -Uz zargs # best in ~/.zshrc
zargs -- **/test<->(.) -- grep -le hello --
С помощью инструментов GNU и любой оболочки (кроме (t)csh, где вам нужно будет поместить команду в одну строку):
Для сортировки по имени:
LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
-regex '.*/test[0-9]+' -type f -print0 |
sort -z |
xargs -r0 grep -le hello --
(добавьте -V
опцию sort
для числовой сортировки)
Для сортировки по времени изменения:
LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
-regex '.*/test[0-9]+' -type f -printf '%T@\t%p\0' |
sort -zrn |
cut -zf2- |
xargs -r0 grep -le hello --
Добавьте/удалите -r
, чтобы sort
изменить порядок на обратный.