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
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
¿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!
0 votos
Que el equipo compruebe la opción de comparación gráfica de las imágenes
0 votos
@bmike ¿a qué te refieres?
0 votos
Quiero decir, deberías comprobar todo lo que hace ese software
0 votos
@bmike bien, voy a echar un vistazo a ella