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?

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}'

¡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).



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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.