1 votos

¿Ordenar los archivos en carpetas según los dos primeros dígitos del nombre del archivo?

Constantemente recibo cientos de archivos .pdf que me gustaría clasificar en carpetas basadas en el nombre del archivo.

Los nombres de archivo se componen de un par de elementos, aunque sólo son relevantes la primera cadena de letras y los dos primeros dígitos. Las letras representan el código del cliente y los dígitos el año.

He aquí dos ejemplos:

  • TX20 4190_100_GR.pdf. TX es el código del cliente y 20 representa el año 2020.
  • SFLYMK22 0921_CR2050_BLKHTH.pdf. SFLYMK es el código del cliente y 22 representa el año 2022.

Los PDF comienzan como hermanos directos de las carpetas del año. Necesito que estos PDFs vayan dentro de la carpeta correcta del año y luego de la carpeta correcta del cliente. Así, por ejemplo, TX204190_100_GR.pdf tendría que ir dentro de 2020 y luego entrar en el TX carpeta. Todas las carpetas ya existirán.

Antes de la clasificación Ejemplo

Ejemplo de clasificación posterior

Estoy luchando por encontrar una manera de seleccionar sólo el código de cliente (que puede ser de 2 a 8 caracteres) y los dos dígitos siguientes con automator para poder mover correctamente los archivos. Supongo que requiere algún tipo de solución regex, pero no sé por dónde empezar o incluso si eso es posible utilizando sólo Automator. Cualquier consejo o ayuda con esto es muy apreciado.

0voto

user3439894 Puntos 5883

Aquí hay un ejemplo Automatizador flujo de trabajo que puede ser útil.

Ejemplo shell script código para el Ejecutar Shell script acción :

d="$HOME/Documents/Orders"

for f in "$@"; do
    if [[ ${f##*/} =~ ([[:alpha:]]{2,8})([[:digit:]]{2})(.*) ]]; then
        c="$match[1]"
        y="$match[2]"
        [ ! -d "$d/20$y/$c/" ] && mkdir -p "$d/20$y/$c/"
        mv -n "$f" "$d/20$y/$c/"
    fi
done

Notas:

Cambia el valor de d a la nombre de ruta completamente calificado del, por ejemplo Pedidos directorio .

En este ejemplo Automatizador flujo de trabajo la configuración de la Ejecutar Shell script acción son: Shell: [/bin/zsh] y Pasa la entrada: [como argumentos] .


enter image description here


Notas:

Como dije, "Aquí hay un ejemplo Automatizador flujo de trabajo ..." y es sólo eso, un ejemplo . La parte principal es la shell script código en Ejecutar Shell script acción ya que hace el verdadero trabajo. Por lo tanto, cualquiera que sea la forma en que desee el flujo de trabajo para pasar un lista de la calificación archivos a la Ejecutar Shell script acción aunque se modifique el código según sea necesario en función de cómo quiera el archivos aprobado, deberías estar en el negocio. Cualquier archivos que no coincide con el regex se ignoran.

Dirigiéndose a un comentario, también hay que tener en cuenta que mientras mkdir -p "$d/20$y/$c/" no necesita ser probada explícitamente, sin embargo, es una fuerza de la costumbre de codificación si se quiere, utilizada en paradigmas similares. Puede omitir el [ ! -d "$d/20$y/$c/" ] && parte de esa comando si así lo desea. Sin embargo, dicho esto, yo lo dejaría como [ ! -d "$d/20$y/$c/" ] && utiliza el zsh comando integrado en el shell para [ y la comprobación de su existencia incurre en una sobrecarga mucho menor que la ejecución innecesaria del mkdir comando cada vez que el objetivo directorio ¡ya existe!


Una forma diferente Automatizador flujo de trabajo

Como ejemplo, el Automatizador flujo de trabajo podría consistir sólo en el Ejecutar Shell script acción con lo siguiente ejemplo shell script código :

d="$HOME/Documents/Orders"

cd "$d" || exit

[ -z "$(ls *.[pP][dD][fF])" ] && exit

for f in *.[pP][dD][fF]; do
    if [[ $f =~ ([[:alpha:]]{2,8})([[:digit:]]{2})(.*) ]]; then
        c="$match[1]"
        y="$match[2]"
        [ ! -d "$d/20$y/$c/" ] && mkdir -p "$d/20$y/$c/"
        mv -n "$f" "$d/20$y/$c/"
    fi
done

Notas:

Cambia el valor de d a la nombre de ruta completamente calificado del, por ejemplo Pedidos directorio .

En este ejemplo Automatizador flujo de trabajo la configuración de la Ejecutar Shell script acción son: Shell: [/bin/zsh] y Pasa la entrada: [a stdin] .

enter image description here


Lo que el ejemplo shell script código lo hace:

  • d="$HOME/Documents/Orders" -- Establece el valor de la d variable a la ubicación de destino del archivos para ser procesado.
  • cd "$d" || exit -- Cambia de directorio al objetivo directorio o sale del script .
  • [ -z "$(ls *.[pP][dD][fF])" ] && exit -- Comprobar la existencia del objetivo PDF archivos y sale del script si no existe ninguno en la ubicación de destino. Esta prueba es necesaria para evitar un error en el for bucle para mantener la Automatizador flujo de trabajo de lanzar un error si se ejecuta y no hay objetivo PDF archivos existe.
  • for f in *.[pP][dD][fF]; do -- Para cada objetivo PDF archivo hacer algo.
  • if [[ $f =~ ([[:alpha:]]{2,8})([[:digit:]]{2})(.*) ]]; then -- Si el objetivo archivo coincide con el regex Entonces, haz algo.
  • c="$match[1]" -- Establece el valor de la c variable a la Código del cliente . El valor de la primera Grupo de captación de la regex .
  • y="$match[2]" -- Establece el valor de la y variable a la Año . El valor de la segunda Grupo de captación de la regex .
  • [ ! -d "$d/20$y/$c/" ] && mkdir -p "$d/20$y/$c/" -- Si el objetivo directorio no existe, entonces créalo.
  • mv -n "$f" "$d/20$y/$c/" -- Mover el objetivo archivo al objetivo directorio .
  • fi -- Cierra el if bloque de declaraciones .
  • done -- Cierra el do bucle .

Explicación del Regex:

enter image description here

enter image description here

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