se você precisar de todos eles
find . -maxdepth 1 -type f | sort | awk '$0 > "./reference"'
se você precisar da primeira
find . -maxdepth 1 -type f | sort | awk '$0 > "./reference"{print;exit}'
Se eu tiver um diretório cheio de arquivos e subdiretórios. Qual é a melhor maneira de listar apenas os arquivos regulares que estão em ordem alfabética antes de uma determinada string?
Atualmente, o melhor que posso fazer usando o bash é o seguinte:
for x in 'find . -maxdepth 1 -type f | sort'
do
if [[ "$x" > './reference' ]]
then
break
fi
echo $x
done
Eu sinto que há uma maneira mais concisa de fazer isso, mas não tenho certeza do que é. Alguma idéia?
Com sed
é mais conciso:
$ find -maxdepth 1 -type f | sort | sed '/^\.\/reference/,$d'
O que significa (após a classificação) excluir a linha de referência (ou maior) e todas as linhas após a última linha.
O comando sed 'd' é usado aqui com um intervalo de endereços, onde '/^./reference/' é o início e '$' é o fim do intervalo. (E '$' como endereço significa a última linha.)
por exemplo. script-name "$HOME" "reference"
... find
nem sempre produz o primeiro ./
, como no caso de find bin
ou find /tmp
. Então, se você quiser apenas os nomes base dos arquivos, isso funciona.
update: Adicionado tolower () para permitir uma comparação insensível a maiúsculas e minúsculas, que produz o agrupamento alfabético mencionado na pergunta ...
#!/bin/bash
dir="$1"; ref="$2"
find "$dir" -maxdepth 1 -type f -printf "%f\n" | awk -v"ref=$ref" 'tolower($0) < tolower(ref)'
Basta enviá-lo para sort
após awk
, se precisar dele classificado.