2 votos

Comparar el contenido de dos carpetas con automator (acción rápida)

Trabajo en una empresa de vídeo. Muy a menudo, copiamos una carga pesada de archivos de las tarjetas SD a nuestras propias carpetas, y antes de formatear las tarjetas SD, queremos comprobar los contenidos en ambos directorios si son los mismos.

He hecho algunas "acciones rápidas" antes, pero esta es demasiado complicada para mí. Lo que quiero hacer es comparar el directorio SD y la carpeta de medios (cada uno tiene una estructura diferente) y comprobar si ambos contienen los mismos archivos, independientemente de las carpetas.

¿Es posible?

Esto puede sonar como que se ha preguntado antes, pero la solución 've visto es la extracción de contenido de la carpeta en otra carpeta, que no es eficiente.

0 votos

¿No funcionaría mejor aquí un DAM - gestor de activos digitales? Parece que su flujo de trabajo para tener activos en ubicaciones arbitrarias es propenso a ralentizar todas y cada una de las búsquedas a medida que se añaden activos.

0 votos

@user3439894 el nombre de la tarjeta sd nunca es el mismo. tipicamente es una carpeta grande con subcarpetas que contienen archivos de video. El nombre de la carpeta multimedia tampoco es nunca el mismo.

0 votos

@bmike Podría ser una solución, debería echarle un vistazo y comentarlo con el equipo, pero prefiero confiar en un script antes que en un software completo, sólo por la facilidad de uso. ¡Gracias de todos modos!

1voto

user3439894 Puntos 5883

Lo que quiero hacer es comparar el directorio de la SD y la carpeta de medios (cada uno tiene una estructura diferente) y comprobar si ambos contienen los mismos archivos, independientemente de las carpetas.

El hecho de que quieras comparar el contenido de, supongo, un único carpeta en el Tarjeta SD contra otro carpeta en el, por ejemplo, Macintosh HD que contiene un estructura jerárquica de directorios ... OMI a shell script es la mejor manera de hacerlo.

El ejemplo shell script código que se muestra a continuación, se guardan como un ejecutable y colocado dentro del PATH pasado a la shell en, por ejemplo, Terminal y hace lo siguiente:

  • Crea una lista de nombres de archivo en el Tarjeta SD que contiene el archivos originales para hacer un bucle, intentando encontrar el archivos duplicados en el estructura jerárquica de directorios de la directorio designado como el directorio principal que contiene el archivos duplicados en el e.g. Macintosh HD independientemente del lugar en el que se encuentre el estructura jerárquica de directorios pueden ser localizados.
  • Si el archivos originales no existen en algún lugar dentro del estructura jerárquica de directorios de los padres que supuestamente contiene el archivos duplicados entonces el archivos originales que no existan ya se copian en el directorio principal que se supone que contiene el archivos duplicados .
  • Si un nombre de archivo existen en ambos lugares, independientemente de su estructura jerárquica de directorios , a comparación binaria se realiza, y si hay una diferencia se informa.
    • Cualquier diferencia tendrá que ser tratada manualmente.
    • Tenga en cuenta que debido a que puede existir la posibilidad de que un archivo con el mismo nombre existe más de una vez en el estructura jerárquica de directorios de los padres que supuestamente contiene el archivos duplicados Cualquier diferencia que se haya notificado en el comparación binaria será necesario verificar manualmente que el archivo en el Tarjeta SD también existe en otra parte de la carpeta local de medios.

En Terminal , asume pwd es su Inicio directorio , ejecute lo siguiente comando compuesto :

f="sdcheck"; touch "$f"; open -e "$f"; chmod 0755 "$f"

En el abierto sdcheck copiar y pegar el ejemplo shell script código que se muestra a continuación, en el documento. Modifique el valor de dupdir variable a un local existente carpeta que contiene los duplicados del Tarjeta SD . A continuación, guarde y cierre el documento.

  • Nota: Yo movería el sdcheck archivo a un lugar que esté dentro del PATH pasado a shell scripts entonces no tendrías que prologar el comando con ./ o incluirlo en nombre de ruta completamente calificado .

De vuelta en Terminal :

% ./sdcheck
Parameter missing!... e.g.: /path/to/directory
Example: sdcheck '/Volumes/SD Card/Media' '/path/to/local_folder'
%

Ejemplo de prueba:

% ./sdcheck '/Volumes/SD Card/Media' /Users/me/Pictures/SD Cards
NOTE: /Volumes/SD Card/Media/IMG_0004.JPG AND /Users/me/Pictures/SD Cards/Card 2/IMG_0004.JPG DIFFER!...
/Volumes/SD Card/Media/IMG_0005.JPG -> /Users/me/Pictures/SD Cards/IMG_0005.JPG
%

Ejemplo shell script código :

#!/bin/bash

if [ -z "${1}" ] || [ -z "${2}" ]; then
    echo "Parameter missing!... e.g.: /path/to/directory"
    echo "Example: sdcheck '/Volumes/SD Card/Media' /path/to/local_folder"
    exit 1
fi  

oridir="${1}"
dupdir="${2}"

if [ ! -d  "${oridir}" ]; then
    echo "The directory \"${oridir}\" does not exist!..."
    exit 1
fi

if [ ! -d  "${dupdir}" ]; then
    echo "The directory \"${dupdir}\" does not exist!..."
    exit 1
fi

while IFS= read -r orifile; do

    while IFS= read -r dupfile; do

        if [ -z "${dupfile}" ]; then
            cp -av "${orifile}" "${dupdir}"
        else
            if ! cmp -s "${orifile}" "${dupfile}"; then
                echo "NOTE: ${orifile} AND ${dupfile} DIFFER!..."
            fi
        fi

    done <<< "$(find "${dupdir}" -type f -name "${orifile##*/}")"

done < <(find "${oridir}" -type f ! -name '.DS_Store')

Utilizando el ejemplo shell script código en Automatizador

Para adaptar el ejemplo shell script código para su uso en un Automatizador flujo de trabajo , aplicación y o Servicio/Acción Rápida es necesario modificarlo con algunos elementos adicionales código y se hace a continuación.

El ejemplo Automatizador flujo de trabajo utiliza AppleScript para elegir el objetivo carpetas El Tarjeta SD y el local carpeta para ser comparado.

El ejemplo shell script código y ejemplo AppleScript código que se muestra a continuación, se probó en Automatizador en MacOS Catalina con Lengua y región ajustes en Preferencias del sistema ajustado a Inglés (EE.UU.) - Primaria y me ha funcionado sin problemas 1 .

  • 1 Asume la configuración necesaria y adecuada en <strong>Preferencias del sistema </strong>> <strong>Seguridad y privacidad </strong>> <strong>Privacidad </strong>se han fijado/abordado según las necesidades.

El Automatizador flujo de trabajo el contorno:

  • Ejecutar AppleScript acción
  • Establecer el valor de la variable acción
    • Variable : theSDCardMediaFolder
  • Ejecutar AppleScript acción
    • Opciones -- [] Ignorar la entrada de esta acción
  • Establecer el valor de la variable acción
    • Variable : theLocalMediaFolder
  • Obtener el valor de la variable acción
    • Variable: theSDCardMediaFolder
    • Opciones -- [] Ignorar la entrada de esta acción
  • Obtener el valor de la variable acción
    • Variable: theLocalMediaFolder
  • Ejecutar Shell script acción

El Automatizador acciones , código y ajustes :


En la primera Ejecutar AppleScript acción sustituya el valor por defecto código con lo siguiente ejemplo AppleScript código :

activate

set theMsg to ¬
    "In the next Choose Folder dialog, select the target folder on the SD Card..."

display dialog ¬
    theMsg buttons {"Continue"} default button 1 ¬
    with title "Select the SD Card Media Folder"

set theSDCardMediaFolder to ¬
    the POSIX path of ¬
        (choose folder with prompt ¬
            "Select the SD Card Media Folder:" default location "/Volumes")

set theSCardMediaFolder to ¬
    characters 1 thru -2 of ¬
    theSDCardMediaFolder as string

return theSDCardMediaFolder

En la primera Establecer el valor de la variable acción , establezca el valor el variable a: theSDCardMediaFolder


En el segundo Ejecutar AppleScript acción sustituya el valor por defecto código con lo siguiente ejemplo AppleScript código :

activate

set theMsg to ¬
    "In the next Choose Folder dialog, select the Local Media Folder."

display dialog ¬
    theMsg buttons {"Continue"} default button 1 ¬
    with title "Select the Local Media Folder"

set theLocalMediaFolder to ¬
    the POSIX path of ¬
        (choose folder with prompt ¬
            "Select the Local Media folder:" default location "/Users")

set theLocalMediaFolder to ¬
    characters 1 thru -2 of ¬
    theLocalMediaFolder as string

return theLocalMediaFolder
  • Opciones -- [] Ignorar la entrada de esta acción

En el segundo Establecer el valor de la variable acción , establezca el valor el variable a: theLocalMediaFolder


En la primera Obtener el valor de la variable acción :

  • Variable: theSDCardMediaFolder
  • Opciones -- [] Ignorar la entrada de esta acción

En el segundo Obtener el valor de la variable acción :

  • Variable: theLocalMediaFolder

En el Ejecutar Shell script acción :

  • Shell: [/bin/bash]
  • Pasa la entrada: [como argumentos]

Sustituir el valor por defecto código con la siguiente modificación ejemplo shell script código :

oridir="${1}"
dupdir="${2}"

logfile="/private/tmp/SD_Card_File_Check_Log.txt"

[ -z "${2}" ] && exit

echo "Begin: $(date -j)" >> "${logfile}"

while IFS= read -r orifile; do

    while IFS= read -r dupfile; do

        if [ -z "${dupfile}" ]; then
            cp -av "${orifile}" "${dupdir}" >> "${logfile}" 2>&1
        else
            if ! cmp -s "${orifile}" "${dupfile}"; then
                echo "NOTE: ${orifile} AND ${dupfile} DIFFER!..." >> "${logfile}"  2>&1
            fi
        fi

    done <<< "$(find "${dupdir}" -type f -name "${orifile##*/}")"

done < <(find "${oridir}" -type f ! -name '.DS_Store')

echo "End: $(date -j)" >> "${logfile}"
echo  >> "${logfile}"

open -e "${logfile}"

Notas:

Para el uso en Automatizador el flujo de trabajo se guardó como un aplicación .

Cuando el Automatizador flujo de trabajo termina, abre el archivo de registro en TextEdit para su revisión. He aquí una muestra de lo que podría ser:

Begin: Thu May 27 14:29:59 EDT 2021
NOTE: /Volumes/SD Card/Media/IMG_0004.JPG AND /Users/me/Pictures/SD Cards/Card 2/IMG_0004.JPG DIFFER!...
/Volumes/SD Card/Media/IMG_0005.JPG -> /Users/me/Pictures/SD Cards/IMG_0005.JPG
End: Thu May 27 14:29:59 EDT 2021

No tenía una Tarjeta SD práctico para revisar su estructura jerárquica de directorios y como tal utilizo un DMG imagen montado y trazado como se muestra en el archivo de registro salida de arriba.

El conjunto de pruebas de imágenes era un muestreo muy pequeño, sin embargo el código La lógica funciona tan expedita como la codificada.

En el ejemplo Automatizador flujo de trabajo imagen de abajo, hay una obvia desconexión en el centro entre algunos de los acciones . Esto se busca y se debe a: Opciones -- [] Ignorar la entrada de esta acción

enter image description here


Nota: El <em>ejemplo </em><strong>shell script </strong><em>código </em>y <em>ejemplo </em><strong>AppleScript </strong><em>código </em>es sólo eso y sin ningún tipo de inclusión <em>tratamiento de errores </em>no contiene ningún otro <em>tratamiento de errores </em>según corresponda. Corresponde al usuario añadir cualquier <em>tratamiento de errores </em>como sea apropiado, necesario o deseado.

Para <strong>AppleScript </strong><em>tratamiento de errores </em>... Echa un vistazo a la <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129232" rel="nofollow noreferrer"><strong>pruebe con </strong></a><em>declaración </em>y <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129657" rel="nofollow noreferrer"><strong>error </strong></a><em>declaración </em>en el <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html" rel="nofollow noreferrer"><strong>Guía del lenguaje AppleScript </strong></a>. Véase también, <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_error_xmpls.html#//apple_ref/doc/uid/TP40000983-CH221-SW1" rel="nofollow noreferrer"><strong>Trabajar con errores </strong></a>. Además, el uso del <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html#//apple_ref/doc/uid/TP40000983-CH216-SW10" rel="nofollow noreferrer"><strong>retraso </strong></a><em>comando </em>puede ser necesario entre eventos cuando sea apropiado, por ejemplo <code>delay 0.5</code> con el <em>valor </em>de la <em>retraso </em>ajustado apropiadamente.

0 votos

@spund3, Por tu comentario a mi comentario ahora borrado al OP, he actualizado el shell script para uso de línea de comandos para tomar dos parámetros. El resto de la respuesta que implica Automatizador no necesita ser actualizado y me imagino que probablemente lo usarás en lugar de la versión de línea de comandos.

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