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?
awk '$0 >= "'"${FROM}"'" && $0 <= "'"${TILL}"'"'
Con
sed
esto es más conciso: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).
fuente
Respuesta obligatoria de zsh, usando el
.
calificador glob para seleccionar solo archivos regulares ye
para seleccionar más entre las coincidencias:fuente
p.ej.
script-name "$HOME" "reference"
...find
no siempre genera el inicio./
, como en el caso defind bin
, ofind /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 ...
Solo póngalo
sort
despuésawk
, si lo necesita ordenado.fuente
$0 < ref
y eso funciona, pero como no hay espacios en la salida de find, el campo $ 2 no existe. ¿Me estoy perdiendo de algo?