Al leer los tutoriales sobre el cambio de nombre de los archivos por lotes en bash y usar el sort
comando para ordenar el contenido del archivo, no he podido descubrir cómo combinar los dos.
Tengo un directorio cuyo contenido está ordenado usando etiquetas dentro del nombre del archivo, similar a cómo el programa TagSpaces maneja las cosas. Agrego las etiquetas que se me ocurren al final del nombre de archivo cuando lo creo o lo descargo. Aquí hay un ejemplo:
Sunrise (2) #wallpaper #4k #googleimages.jpg
Ahora quiero revisar todos estos archivos y cambiarles el nombre para que las etiquetas se ordenen alfabéticamente, sin afectar nada antes o después de las etiquetas (por ejemplo, el título de una imagen o la extensión del archivo). Entonces lo anterior se convertiría en:
Sunrise (2) #4k #googleimages #wallpaper.jpg
¿Cómo logro esto? Ni siquiera puedo imaginar cómo pasar el nombre de un archivo , y no su contenido, a un comando como sort
, cuya salida podría canalizar mv
.
Respuestas:
Pruebas:
fuente
Si tiene el basado en perl
rename
(prename
en algunos sistemas), entonces podría hacer una división + ordenar las etiquetas usando perl. Por ejemplo, dadoluego (con algunas disputas feas para eliminar y reemplazar el
.jpg
sufijo)Comprobación
Probablemente hay mucho margen de mejora, pero espero que te dé alguna idea.
fuente
Con
zsh
:(eliminar el
-n
(marcha en seco) si está satisfecho)[^#]#
: 0 o más caracteres que no son # (#
es como*
en expresiones regulares)s: :
dividido en el espacioo
: orden (ordenar)j: :
: únete con el espacio.Entonces, estamos dividiendo la parte entre la primera
#
(incluida) y la última.
(excluida) en el espacio, ordenamos la lista resultante que unimos nuevamente con el espacio.Recursivamente:
Para permitir espacios en los nombres de etiquetas, podríamos dividir
#
y recortar espacios finales, ordenar y unir#
con:Agregue un
(#qD)
calificador global si también desea procesar archivos ocultos (D
ot archivos) o si desea procesar archivos en directorios ocultos.fuente
¡Buena pregunta!
Aquí está mi
bash
script simple para esto:Explicación:
En
afile=( ${file#*)} );
: estamos convirtiendo la cadena en una matriz. En este estado, el shell realiza la división de palabras con espacios a menos que cite la cadena.En
${file#*)}
( cut-up-to-first-prefix ): estamos quitando todo desde el comienzo de la cadena hasta que se)
ve por primera vez,shell parameter expansion
ya que resultará#wallpaper #4k #googleimages.jpg
teniendo en cuenta elfile="Sunrise (2) #wallpaper #4k #googleimages.jpg"
En
${file%%#*}
( corte hasta el último sufijo ); pelar desde el principio hasta el principio de la cuerda hasta la última#
vez que se ve. esto resultaráSunrise (2)
En
${afile[@]%%.*}
( cut-up-last-last-sufijo ): igual que el anterior, el despojo comienza desde el final hasta el comienzo de la secuencia (aquí en cada matriz indexada) hasta la última.
vez que se ve. esto resultará#wallpaper #4k #googleimages
, ¡también podríamos usar${afile[@]%.*}
mejor!En
printf "%s\n" "${afile[@]%%.*}"
: estamos imprimiendo los elementos de la matriz con líneas nuevas ([@]
utilizadas para la matriz indexada), (¿por qué con las líneas nuevas? Porque las clasificaremos y deberíamos dividir los elementos en líneas nuevas)En
$(sort<(printf "%s\n" "${afile[@]%%.*}"))
: estamos ordenando los elementos (o etiquetas).En
$(echo $(sort<(printf "%s\n" "${afile[@]%%.*}")))
: igual que el anterior pero usamos unecho
comando adicional para reunir los elementos ordenados en uno lineal.posible lo mismo también con usar doble
xargs
like... |xargs -n1| sort | xargs
.Consulte el siguiente ejemplo para comprender mejor este paso:
Finalmente, al final, el
mv
comando está cambiando el nombre$file
al nombre modificado que debería ser.Ps: eliminar
echo mv ...
delante delmv
para salir de la ejecución en seco y realizar un cambio de nombre real.fuente
Esto parece demasiado complicado para que Bash sea sincero. No es imposible, pero en mi opinión, es mucho mejor usar un lenguaje hecho para programación "real" aquí. Es probable que una solución Bash sea imposible de mantener. (No estoy tratando de insultar la solución solo Bash, creo que la magia de cambio de nombre es bastante sorprendente, en realidad)
Dicho esto, aquí hay una solución con Ruby. Puede escribirlo en un archivo y luego simplemente ejecutar el archivo desde su shell, dado que tiene instalado Ruby.
Para ejecutar el script, simplemente colóquelo en el directorio donde se encuentran sus imágenes. Esta solución debería ser bastante resistente a los nombres y etiquetas de imágenes tontas, ya
C#
que no causarán problemas. Dicho esto, asegúrese de hacer una copia de seguridad antes de ejecutar el script. Las operaciones de movimiento pueden ser tan destructivas como arm
.fuente