Encontre arquivos em ordem alfabética antes de uma determinada sequência


8

Se eu tiver um diretório cheio de arquivos e subdiretórios. Qual é a melhor maneira de listar apenas os arquivos regulares que caem 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

Sinto que há uma maneira mais concisa de fazer isso, mas não tenho certeza do que é. Alguma ideia?

Respostas:


4

se você precisar de todos eles

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

se você precisar do primeiro

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"{print;exit}'

Obrigado! Uma variação deste para obter todos os arquivos entre os dados variáveis seriam:awk '$0 >= "'"${FROM}"'" && $0 <= "'"${TILL}"'"'
Nickolay

3

Com sedisso é 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 superior) 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.)



3

por exemplo. script-name "$HOME" "reference"... findnem sempre gera o líder ./, como no caso de find bin, ou find /tmp. Portanto, se você deseja apenas os nomes de base do arquivo, isso funciona.

update: Adicionado tolower () para permitir uma comparação sem distinção entre 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 canalizá-lo para sortdepois awk, se precisar.


Isso não parece funcionar. Eu mudei a última parte do script awk para ser $0 < refe isso funciona, mas como não há espaços na saída de localização, o campo $ 2 não existe. Estou esquecendo de algo?
Mike deck

Obrigado, fiz uma alteração rápida no último momento e perdi esse campo (ele originalmente tinha dois campos delimitados por \ xFF ) ... Agora, que dormi um pouco, percebo que não é manuseio da caixa corretamente. Suponho que, como a pergunta se refira a um agrupamento alfabético , isso não faz distinção entre maiúsculas e minúsculas . Eu atualizei a resposta.
Peter.O
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.