Как отобразить отсортированный список файлов, содержащих определенную строку в терминале Linux

Как отобразить отсортированный список файлов, содержащих определенную строку в терминале Linux

Предположим, у меня есть 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между ).test1test2

Если вы столкнетесь сСлишком много доводовошибка (вызванная ограничением системного 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изменить порядок на обратный.

Связанный контент