1 votos

Zsh - Ordenar la expansión de archivos en Terminal de MacOS como en Finder: numéricamente y sin distinción entre mayúsculas y minúsculas

¿Es posible en Terminal de MacOS tener el orden de clasificación numérico y sin distinción de mayúsculas, casi como en Finder? Estoy en MacOS 14 Sonoma, usando la aplicación Terminal con zsh 5.9 y oh-my-zsh.

Estoy tratando de ejecutar algunos comandos de línea para todos los archivos en una carpeta específica. Por favor compara:

Mi orden de clasificación deseado

Orden de clasificación de MacOS Finder por nombre

bar.jpg
bar-2.jpg
bar-10.jpg
foo.jpg
foo-1.jpg
foo-2.jpg
foo-10.jpg
STA.jpg
STA-3.jpg
STA-20.jpg

bar-2.jpg
bar-10.jpg
bar.jpg
foo-1.jpg
foo-2.jpg
foo-10.jpg
foo.jpg
STA-3.jpg
STA-20.jpg
STA.jpg

La forma del Finder estaría bien, pero no es ideal, ya que deja foo.jpg debajo de foo-1.jpg

Aquí están los comandos que intenté:

for file in *; do echo $file; done

for file in *(n); do echo $file; done

STA-20.jpg
STA-3.jpg
STA.jpg
bar-10.jpg
bar-2.jpg
bar.jpg
foo-1.jpg
foo-10.jpg
foo-2.jpg
foo.jpg

STA-3.jpg
STA-20.jpg
STA.jpg
bar-2.jpg
bar-10.jpg
bar.jpg
foo-1.jpg
foo-2.jpg
foo-10.jpg
foo.jpg

El último trae un orden de clasificación numérico y es lo más cercano que pude llegar a Finder, pero deja los archivos en mayúsculas STA* encima de los archivos en minúsculas bar*

Intenté usar el calificador glob porque parecía la sintaxis más simple, pero si no es posible lograrlo, por favor sugiere otras formas de ejecutar comandos en varios archivos después de ordenarlos de la manera que deseo.

3voto

Aeronautix Puntos 31

Puedes usar la clasificación de versiones (-V) sin distinción de mayúsculas o minúsculas (-f) con sort:

cd 
while IFS= read -r -d $'\0' filename; do
  # 
  printf "%q\n" "$filename"
done < <(find . -type f -print0 | sort -z -f -V)

O de manera más eficiente si tu(s) comando(s) puede(n) procesar todos los nombres de archivo:

cd 
nombres_archivo=()
while IFS= read -r -d $'\0' filename; do
  nombres_archivo+=( "$filename" )
done < <(find . -type f -print0 | sort -z -f -V)
# 
printf "%q\n" "${nombres_archivo[@]}"

Estas son formas seguras y portátiles de ejecutar comandos para una lista de nombres de archivo. Ambas dan como resultado:

./bar.jpg
./bar-2.jpg
./bar-10.jpg
./foo.jpg
./foo-1.jpg
./foo-2.jpg
./foo-10.jpg
./STA.jpg
./STA-3.jpg
./STA-20.jpg

2voto

Mikhail Morfikov Puntos 356

Esto generará una lista ordenada similar a la de Finder:

lc() { REPLY=$REPLY:l }
print -rl -- *(no+lc)

Salida:

bar-2.jpg
bar-10.jpg
bar.jpg
foo-1.jpg
foo-2.jpg
foo-10.jpg
foo.jpg
STA-3.jpg
STA-20.jpg
STA.jpg

Esto agrega el calificador de globo o+, que puede ejecutar código shell para proporcionar un valor para ordenar que sea diferente al nombre de archivo original. Aquí el código en la función lc cambia el nombre de archivo de ordenación a minúsculas con el modificador :l, para que la ordenación sea insensible a mayúsculas y minúsculas. Tenga en cuenta que esto no cambia el nombre de archivo mostrado.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X