Automatice el movimiento y el cambio de nombre de archivos

Tengo archivos anidados en varias subcarpetas. Quiero mover estos archivos, una carpeta hacia arriba en la estructura de carpetas y cambiar el nombre de los archivos según su nueva carpeta principal. Necesitaré que esto se automatice con un script.

Lógica de ejemplo

  1. Buscar carpeta raíz
  2. Obtenga el contenido de la subcarpeta de los archivos de la subcarpeta .
  3. Mover archivos a su carpeta principal (también conocida como carpeta 'Adjuntos')
  4. Cambie el nombre de los archivos a su nombre de carpeta principal actual .
  5. Eliminar subcarpeta vacía
  6. Repita la acción anterior de las carpetas de la carpeta raíz hasta que se complete.

Cambiar el nombre de los detalles

La carpeta de archivos adjuntos puede tener uno o varios archivos de .pngo .jpg. Por ejemplo, la carpeta Adjuntos podría tener Apple.pngy Dog-house.jpg. Si estos archivos se mueven y se les cambia el nombre, espero que el nombre del archivo sea algo como esto MCP##-##### - abc.pngy MCP##-##### - abc.jpg.

Si hay más de un archivo con el mismo tipo de archivo, entonces el nombre será algo como esto MCP##-##### - abc.pngyMCP##-##### - abc (1).png

Ejemplo de estructura de carpetas

ingrese la descripción de la imagen aquí

Resultado deseado

![ingrese la descripción de la imagen aquí

Supongo que esto puede requerir la automatización con un script, pero no tengo idea de cómo hacerlo. ¿Alguien puede ayudarme?

¿La estructura jerárquica de carpetas es siempre como se muestra en las imágenes, por ejemplo, ../Applications/MCP##-##### - abc.../Attachments/y solo hay un archivo JPEG en cada carpeta de Adjuntos y solo una carpeta de Adjuntos en las MCP##-##### - abc...carpetas, por ejemplo?
@user3439894 - La estructura jerárquica de carpetas sigue siendo la misma en toda la carpeta raíz (como se muestra en las capturas de pantalla); sin embargo, la Attachmentscarpeta podría contener uno o varios archivos y los tipos de archivo podrían ser .jpego.png
¿Qué es, "la carpeta podría contener uno o quizás archivos"? Si hay más de un archivo, ¿pueden tener la misma extensión pero diferentes nombres base? Si lo hacen, entonces la convención de nomenclatura deseada sobrescribirá uno más de los archivos. ¡Edite su pregunta para que contenga todos los detalles!
Por ejemplo, una Attachmentscarpeta podría tener Apple.pngy Dog-house.jpeg. Si estos archivos se mueven y se les cambia el nombre, espero que el nombre del archivo sea algo como esto MCP##-##### - abc.pngy MCP##-##### - abc.jpeg. Si hay más de un archivo con el mismo tipo de archivo, entonces el nombre será algo como esto MCP##-##### - abc.pngy MCP##-##### - abc (1).png.
La información sobre la convención de nomenclatura en su último comentario entra en conflicto con la información que se muestra en la imagen de resultados deseados. ¡Edite y actualice su pregunta con toda la información adecuada y relevante!
@ user3439894 - Ha actualizado la información anterior. Gracias :). ¿Eres capaz de ayudar?
Estoy seguro de que esta pregunta (casi exactamente, o muy de cerca) ha sido formulada y respondida muchas veces en los últimos 12 meses en Stack Exchange. Si realiza una búsqueda, entre Ask Different y StackOverflow, podrá encontrar scripts para esto.
@CJK Encontré algo similar pero yendo 2 niveles dentro de las subcarpetas y recorriendo este proceso desde la carpeta raíz, no puedo encontrarlo.
Puede ignorar mi comentario anterior ahora eliminado y he retrocedido a la primera versión, ya que rmdirno eliminará un directorio que no esté vacío y la verificación agregada fue innecesaria. Habría sido necesario si hubiera usado, por ejemplo , rm -rf "$d"vs. rmdir "$d"Lo siento si causó alguna confusión.

Respuestas (1)

El siguiente es un ejemplo de flujo de trabajo de Automator que logra el objetivo declarado de su pregunta según su estructura de carpetas jerárquica definida.

NOTA: Si bien el código de ejemplo utilizado en la acción Ejecutar script de shell se completó correctamente, el usuario tiene la responsabilidad de asegurarse de que existan las copias de seguridad adecuadas antes de usarlo. Incluso sugeriría hacer una pequeña copia de muestra de la estructura de carpetas jerárquica de destino para probarla antes de ejecutar el flujo de trabajo en el destino original.bash

Con el fin de probar este flujo de trabajo , se creó la siguiente estructura jerárquica de carpetas con sus archivos:

$ tree ./Applications
./Applications
├── MCP19-00633 - Sport and Play at Br
│   └── Attachments
│       ├── barfoo.png
│       ├── filename.jpg
│       ├── filename.png
│       └── foobar.jpg
├── MCP19-00753 - Active Nabiac
│   └── Attachments
│       ├── barfoo.png
│       ├── filename.jpg
│       ├── filename.png
│       └── foobar.jpg
└── MCP19-00824 - A Family Friendly Ve
    └── Attachments
        ├── barfoo.jpg
        ├── barfoo.png
        ├── filename.jpg
        ├── filename.png
        ├── foobar.jpg
        ├── namefile.jpg
        └── namefile.png

6 directories, 15 files
$ 

Los resultados del flujo de trabajo de Automator se ejecutan en el objetivo anterior:

$ tree ./Applications
./Applications
├── MCP19-00633 - Sport and Play at Br
│   ├── MCP19-00633 - Sport and Play at Br (1).jpg
│   ├── MCP19-00633 - Sport and Play at Br (1).png
│   ├── MCP19-00633 - Sport and Play at Br.jpg
│   └── MCP19-00633 - Sport and Play at Br.png
├── MCP19-00753 - Active Nabiac
│   ├── MCP19-00753 - Active Nabiac (1).jpg
│   ├── MCP19-00753 - Active Nabiac (1).png
│   ├── MCP19-00753 - Active Nabiac.jpg
│   └── MCP19-00753 - Active Nabiac.png
└── MCP19-00824 - A Family Friendly Ve
    ├── MCP19-00824 - A Family Friendly Ve (1).jpg
    ├── MCP19-00824 - A Family Friendly Ve (1).png
    ├── MCP19-00824 - A Family Friendly Ve (2).jpg
    ├── MCP19-00824 - A Family Friendly Ve (2).png
    ├── MCP19-00824 - A Family Friendly Ve (3).jpg
    ├── MCP19-00824 - A Family Friendly Ve.jpg
    └── MCP19-00824 - A Family Friendly Ve.png

3 directories, 15 files
$ 

La siguiente imagen del flujo de trabajo de ejemplo de Automator contiene las acciones utilizadas y sus configuraciones particulares utilizadas desde sus valores predeterminados. Asegúrese de hacer coincidir la configuración que se muestra en la imagen. En particular, la acción Obtener contenido de la carpeta tiene marcada la opción [√] Repetir para cada subcarpeta encontrada , y la acción Ejecutar script de Shell tiene Entrada de paso: establecida como argumentos .

Imagen de flujo de trabajo de Automator


bash Código de ejemplo :

for f in "$@"; do

    [[ -f $f ]] || continue

        ext="${f##*.}"
        move_to_dir="$(dirname "$(dirname "$f")")"
        filename="$(basename "$move_to_dir")"

        cd "$move_to_dir" || exit

        if [[ ! -e ${filename}.${ext} ]]; then
            mv "$f" "${filename}.${ext}"
        else
            n=1
            for i in "${filename}" *".${ext}"; do
                if [[ "${filename} (${n}).${ext}" == "$i" ]]; then
                    n=$(( n + 1 ))
                fi
            done
            mv "$f" "${filename} (${n}).${ext}"
        fi
done

for d in "$@"; do
    [[ -d $d ]] || continue
    [[ $(basename "$d") == Attachments ]] || continue
    rmdir "$d"
done

Nota: El código de ejemplo es solo eso y solo contiene un manejo mínimo de errores, y se verificó mediante ShellCheck . Sin embargo, es posible que no contenga todo el manejo de errores deseado/necesario apropiado. El usuario tiene la responsabilidad de agregar cualquier manejo de errores que sea apropiado, necesario o deseado.bash

Muchas gracias, esto es exactamente lo que estaba buscando y funcionó! ¡Asombrado!
@Andrew C. Duarte, Me alegro de haber podido ayudar y lamento no haber tenido tiempo de comentar el código en cuanto a lo que estaba haciendo explícitamente, pero saber que funcionaría era más importante.