Mover archivos automáticamente a una carpeta principal + eliminar subcarpeta

Estoy tratando de descubrir cómo mover archivos automáticamente de una carpeta a su carpeta principal y eliminar la carpeta original. Para ilustrar, aquí está mi estructura:

Parent Folder
    – Subfolder
            – File.avi
            - File2.avi
            - Otherfile.trash

Quiero mover todos mis archivos .avi al Parent Foldery deshacerme de ellos Subfolderpor completo ( Subfoldertodavía no estará vacío después de mover estos archivos, pero quiero eliminarlo y sus restos de contenido).

He estado jugando con Hazel, pero supongo que mi lógica no es la mejor y no puedo resolverlo. ¿Es posible con Hazel o Automator o ambos?

¡Gracias de antemano!

Respuestas (1)

La siguiente solución moverá todos (y solo) los archivos ".avi" dentro de las subcarpetas (un nivel de profundidad) a la carpeta principal y eliminará las subcarpetas. Puede que no sea la solución más óptima, ya que hay muchas maneras diferentes en las que se pueden escribir scripts de shell para resolver un problema.

Supuestos y restricciones:

  1. Solo se moverán los archivos ".avi". Otros archivos serán ignorados y eliminados sin previo aviso.
  2. El script (actualizado) funciona solo tres niveles por debajo de la carpeta principal. Si hay subcarpetas dentro de las subcarpetas que contienen archivos ".avi", se eliminarán como cualquier otro archivo (incluidos los archivos ".avi").
  3. Este script puede manejar archivos ".avi" que tienen espacios en el nombre del archivo.

Precaución: Esto utiliza un script de shell que mueve archivos y elimina directorios/archivos por completo. Tenga una copia de seguridad antes de intentar usarla (incluso los cambios menores en la secuencia de comandos pueden causar problemas graves e irrecuperables). No hay forma de recuperarse de ningún problema, excepto restaurar desde una copia de seguridad.

Solución:

  • En Hazel, configure un control para la carpeta principal en el panel Carpetas de la izquierda.
  • Agregue una regla haciendo clic en el botón "+" y asígnele el nombre que desee.
  • Establezca los criterios de condiciones de la siguiente manera

    If <any> of the following conditions are met for <any of its sub-files or folders>
    
    <Any File>
    
  • Establezca Haga lo siguiente en el archivo o carpeta coincidente: de la siguiente manera

    <Run shell script> <embedded script>
    
  • Haga clic en el botón Editar secuencia de comandos al lado del menú desplegable.
  • Deje la opción Shell: en el valor predeterminado ( '/bin/sh).
  • En el cuadro de texto a continuación, copie y pegue este script de shell (he incluido comentarios que comienzan con #; son solo para que sea más fácil de entender o modificar)

    # Get the directory name and go into it - this should be the parent directory
    dir=`dirname $1`
    cd $dir
    
    # Find all directories one level below
    # For each subdirectory, move all ".avi" files to its parent directory,
    # then remove the subdirectory and its contents (change avi to any other extension if necessary)
    find . ! -path . -type d -maxdepth 1 -exec sh -c '
    dir="$0"
    mv $dir/*/*/*.avi $dir/..
    rm -rf $dir
    ' {} ';'
    
¡Esto es fantástico, muchas gracias! ¿Sería fácil cambiarlo para buscar archivos .avi de 3 niveles de profundidad? Técnicamente, quiero que Hazel mire la carpeta de nivel superior y las carpetas con archivos .avi se encuentran en 3 niveles de profundidad. De lo contrario, tendría que crear reglas de bazilion para cada carpeta.
Solo para aclarar, mi estructura de carpetas real se ve así: pastebin.com/HaTmKenk : quiero mover los archivos .avi un nivel más arriba y eliminar la "subcarpeta" con las sobras.
Sí, es posible mirar carpetas de tres niveles de profundidad, pero cualquier solución tendría que tener límites definidos. ¿Se fija a tres niveles de profundidad? Eso es un cambio simple. Si necesita que sea flexible para mirar cualquier profundidad, este script sería completamente diferente.
Sí, siempre tiene 3 niveles de profundidad. Aquí hay una captura de pantalla de un ejemplo de la vida real: dropbox.com/s/bm53ems7iyqy6g4/… - lo que quiero hacer es que Hazel mire la carpeta "Programas de TV" y pueda mover archivos (sí, en realidad son .mkv no .avi) desde las carpetas creadas por torrent hasta un nivel superior a las carpetas específicas de la temporada. En mi captura de pantalla, el archivo seleccionado debe subir de nivel. Siempre será el mismo nivel, creo. Espero que tenga sentido y gracias de nuevo por su ayuda! :)
¿Puede ayudarme a modificar este script para que coincida con mis necesidades (3 niveles de profundidad), por favor?
Hecho. ¡Tenga una copia de seguridad antes de probarla y usarla!
Lo probé creando una estructura de carpetas aleatoria con un archivo .txt de 3 niveles de profundidad, y Hazel vigiló esa carpeta. También descargué trash-cli y reemplacé your rm -rfto trashpara sentirme "más seguro". Sin embargo, por alguna razón, procedió a mover archivos .txt y eliminar carpetas de todo mi disco duro, por lo que algo no está del todo bien. ¿ Puedes explicar qué está pasando en el findcomando? ¿Por qué Hazel da dir $0 en lugar de $1? Además, dado que es solo una carpeta que necesito monitorear, ¿podríamos simplemente codificarla en lugar de usar variables?
Hope Hazel está mirando la carpeta principal (la del nivel superior) y no las de los tres niveles inferiores. El $ 1 de Hazel se usa solo para ingresar a la carpeta principal. Desde la carpeta principal, el findcomando busca directorios justo debajo de la carpeta principal; ese es el $0 aquí. En cada uno de esos directorios, el mvcomando va tres niveles más profundo (cada * es un nivel más profundo) y mueve el archivo hacia arriba.
Esta se está convirtiendo en una discusión muy larga y no funciona bien para el formato de este sitio. Deberíamos tomar esto para charlar o en otro lugar.
Si está dispuesto a ayudarme a hacerlo bien, ¿dónde puedo contactarlo?
twitter.com - askdifferent0