Encuentra archivos alfabéticamente antes de una cadena dada

8

Si tengo un directorio lleno de archivos y subdirectorios. ¿Cuál es la mejor manera de enumerar solo los archivos regulares que se encuentran alfabéticamente antes de una cadena dada?

Actualmente, lo mejor que puedo hacer con bash es lo siguiente:

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

   echo $x
done

Siento que hay una manera más concisa de hacer esto, pero no estoy seguro de qué es. ¿Algunas ideas?

Mike Deck
fuente

Respuestas:

4

si los necesitas a todos

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

si necesitas el primero

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"{print;exit}'
iruvar
fuente
¡Gracias! Una variación de esto para obtener todos los archivos entre las variables dadas sería:awk '$0 >= "'"${FROM}"'" && $0 <= "'"${TILL}"'"'
Nickolay
3

Con sedesto es más conciso:

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

Lo que significa (después de ordenar) eliminar la línea de referencia (o superior) y todas las líneas que siguen a la última línea.

El comando sed 'd' se usa aquí con un rango de direcciones, donde '/^./reference/' es el comienzo y '$' es el final del rango. (Y '$' como dirección significa la última línea).

maxschlepzig
fuente
3

Respuesta obligatoria de zsh, usando el . calificador glob para seleccionar solo archivos regulares y epara seleccionar más entre las coincidencias:

echo *(.e\''[[ $REPLY > reference ]]'\')
Gilles 'SO- deja de ser malvado'
fuente
3

p.ej. script-name "$HOME" "reference"... findno siempre genera el inicio ./, como en el caso de find bin, o find /tmp. Entonces, si solo desea los nombres base del archivo, esto funciona.

actualización: Se agregó tolower () para permitir una comparación que no distingue entre mayúsculas y minúsculas, lo que produce la clasificación alfabética mencionada en la pregunta ...

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

Solo póngalo sortdespués awk, si lo necesita ordenado.

Peter.O
fuente
Esto no parece funcionar. Cambié la última parte del script awk para que sea $0 < refy eso funciona, pero como no hay espacios en la salida de find, el campo $ 2 no existe. ¿Me estoy perdiendo de algo?
Mike Deck
Gracias, hice un cambio rápido en él en el último momento, y perdí ese campo (originalmente tenía dos campos delimitados por \ xFF ) ... Ahora, que he dormido un poco, puedo ver que no está manejando el caso correctamente. Supongo que, como la pregunta se refiere a una clasificación alfabética , significa mayúsculas y minúsculas . He actualizado la respuesta.
Peter.O