Localizar arquivos em ordem alfabética antes de uma determinada string

8

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?

    
por Mike Deck 25.07.2012 / 18:56

4 respostas

4

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}'
    
por 25.07.2012 / 20:10
3

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 25.07.2012 / 21:25
3

Resposta zsh obrigatória, usando o qualificador de glob . para selecionar apenas arquivos e e para selecionar ainda mais as correspondências:

echo *(.e\''[[ $REPLY > reference ]]'\')
    
por 26.07.2012 / 02:05
3

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.

    
por 25.07.2012 / 21:00

Tags