Найти файлы в алфавитном порядке перед заданной строкой

8

Если у меня есть каталог, полный файлов и подкаталогов. Каков наилучший способ перечислить только обычные файлы, которые располагаются в алфавитном порядке перед заданной строкой?

На данный момент лучшее, что я могу сделать с помощью bash, это следующее:

for x in `find . -maxdepth 1 -type f | sort`
do
   if [[ "$x" > './reference' ]]
   then
      break
   fi

   echo $x
done

Я чувствую, что есть более краткий способ сделать это, но я не уверен, что это такое. Любые идеи?

Майк Дек
источник

Ответы:

4

если вам нужно их все

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"'

если вам нужен первый

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"{print;exit}'
Iruvar
источник
Спасибо! Вариант этого для получения всех файлов между заданными переменными будет:awk '$0 >= "'"${FROM}"'" && $0 <= "'"${TILL}"'"'
Николай
3

С sedэтим более кратко:

$ find -maxdepth 1 -type f | sort | sed '/^\.\/reference/,$d'

Что означает (после сортировки) удаление контрольной строки (или больше) и всех строк, следующих за последней строкой.

Команда sed 'd' используется здесь с диапазоном адресов, где '/^./reference/' - начало, а '$' - конец диапазона. (И «$» в качестве адреса означает последнюю строку.)

maxschlepzig
источник
3

Обязательный zsh-ответ с использованием . спецификатора glob для выбора только обычных файлов и eдальнейшего выбора между совпадениями:

echo *(.e\''[[ $REPLY > reference ]]'\')
Жиль "ТАК - перестань быть злым"
источник
3

например. script-name "$HOME" "reference"... findне всегда выводит ведущий ./, как в случае find bin, или find /tmp. Так что, если вам нужны только имена файлов, это работает.

обновление: добавлен tolower () для сравнения без учета регистра, что приводит к алфавитному сопоставлению, указанному в вопросе ...

#!/bin/bash
dir="$1"; ref="$2"
find "$dir" -maxdepth 1 -type f -printf "%f\n" | awk -v"ref=$ref" 'tolower($0) < tolower(ref)'

Просто отправьте трубку sortпосле awk, если вам это нужно отсортировать.

Peter.O
источник
Это не похоже на работу. Я изменил последнюю часть сценария awk, чтобы она $0 < refработала, но поскольку в выводе find нет пробелов, поле $ 2 не существует. Я что-то пропустил?
Майк Дек
Спасибо, я быстро изменил его в последний момент и пропустил это поле (изначально у него было два поля с разделителями \ xFF ) ... Теперь, когда я немного поспал, я вижу, что это не так обращаться с делом правильно. Я предполагаю, что поскольку вопрос относится к алфавитному сопоставлению, это означает, что регистр не учитывается . Я обновил ответ.
Peter.O