Ce que je veux faire, c'est comparer le répertoire SD et le dossier media (chacun a une structure différente) et vérifier si les deux contiennent les mêmes fichiers, indépendamment des dossiers.
Le fait que vous vouliez comparer le contenu de, je suppose, un seul dossier sur le Carte SD contre un autre dossier sur le, par exemple, Macintosh HD contenant un tout autre structure de répertoire hiérarchique ... IMO a shell script est la meilleure solution.
El exemple shell script code montré ci-dessous, sont sauvegardés en tant que exécutable et placé dans le PATH
transmis à la coquille dans, par exemple, Terminal et fait ce qui suit :
- Crée une liste de noms de fichiers sur le Carte SD contenant le les fichiers originaux à parcourir en boucle, en essayant de trouver le fichiers en double dans le structure de répertoire hiérarchique de la répertoire désigné comme le répertoire parent contenant le fichiers en double sur l'e.g. Macintosh HD quel que soit l'endroit où se trouve l structure de répertoire hiérarchique ils peuvent être localisés.
- Si le les fichiers originaux n'existent pas quelque part dans le structure de répertoire hiérarchique parent qui est censé contenir le fichiers en double alors le les fichiers originaux qui n'existent pas encore sont copiés dans le fichier répertoire parent qui est censé contenir le fichiers en double .
- Si un nom de fichier existent dans les deux endroits, indépendamment de leur structure de répertoire hiérarchique , a comparaison binaire est effectuée, et s'il y a une différence, elle est signalée.
- Toute différence devra être traitée manuellement.
- Notez que parce qu'il peut y avoir une possibilité qu'un fichier avec le même nom existe plus d'une fois dans le structure de répertoire hiérarchique parent qui est censé contenir le fichiers en double toute différence signalée dans le comparaison binaire devra être vérifié manuellement que le fichier sur le Carte SD existe également ailleurs dans le dossier média local.
Sur Terminal , suppose pwd
est votre Accueil répertoire exécutez ce qui suit commandement composé :
f="sdcheck"; touch "$f"; open -e "$f"; chmod 0755 "$f"
Dans l'ouverture sdcheck copier et coller le exemple shell script code illustré ci-dessous, dans le document. Modifiez le valeur de dupdir
variable à un local existant dossier contenant les doublons de la Carte SD . Ensuite, enregistrez et fermez le document.
-
Note : Je déplacerais le
sdcheck
fichier à un endroit qui se trouve dans la PATH
transmis à shell scripts alors vous n'auriez pas besoin de faire précéder les commande avec ./
ou inclure le nom de chemin entièrement qualifié .
Retour dans Terminal :
% ./sdcheck
Parameter missing!... e.g.: /path/to/directory
Example: sdcheck '/Volumes/SD Card/Media' '/path/to/local_folder'
%
Exemple de test :
% ./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
%
Exemple shell script code :
#!/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')
Utilisation de la exemple shell script code en Automator
Pour adapter le exemple shell script code pour une utilisation dans un Automator flux de travail , application et ou Service/action rapide il doit être modifié avec quelques code ajouté, ce qui est fait ci-dessous.
El exemple Automator flux de travail utilise AppleScript pour choisir la cible dossiers le Carte SD et le local dossier à comparer.
El exemple shell script code y exemple AppleScript code montré ci-dessous, a été testé dans Automator sous MacOS Catalina avec Langue et région paramètres dans Préférences du système réglé sur Anglais (US) - Primaire et a fonctionné pour moi sans problème 1 .
- 1 Assume la mise en place nécessaire et appropriée dans <strong>Préférences du système </strong>> <strong>Sécurité et confidentialité </strong>> <strong>Vie privée </strong>ont été fixés/réglés selon les besoins.
El Automator flux de travail contour :
-
Exécuter AppleScript action
-
Définir la valeur de la variable action
-
Variable :
theSDCardMediaFolder
-
Exécuter AppleScript action
-
Options -- [] Ignorer l'entrée de cette action
-
Définir la valeur de la variable action
-
Variable :
theLocalMediaFolder
-
Obtenir la valeur d'une variable action
-
Variable :
theSDCardMediaFolder
-
Options -- [] Ignorer l'entrée de cette action
-
Obtenir la valeur d'une variable action
-
Variable :
theLocalMediaFolder
-
Exécuter le Shell script action
El Automator actions , code et paramètres :
Dans le premier Exécuter AppleScript action remplace la valeur par défaut code avec les éléments suivants exemple AppleScript code :
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
Dans le premier Définir la valeur de la variable action fixer le valeur le site variable à : theSDCardMediaFolder
Dans le deuxième Exécuter AppleScript action remplace la valeur par défaut code avec les éléments suivants exemple AppleScript code :
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
-
Options -- [] Ignorer l'entrée de cette action
Dans le deuxième Définir la valeur de la variable action fixer le valeur le site variable à : theLocalMediaFolder
Dans le premier Obtenir la valeur d'une variable action :
-
Variable :
theSDCardMediaFolder
-
Options -- [] Ignorer l'entrée de cette action
Dans le deuxième Obtenir la valeur d'une variable action :
-
Variable :
theLocalMediaFolder
Dans le Exécuter le Shell script action :
- Shell : [/bin/bash]
- Passez l'entrée : [comme arguments]
Remplacer la valeur par défaut code avec les modifications suivantes exemple shell script code :
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}"
Notes :
Pour l'utilisation dans Automator le site flux de travail a été enregistré comme un application .
Lorsque le Automator flux de travail se termine, il ouvre le fichier journal en TextEdit pour son examen. Voici un exemple de ce à quoi il pourrait ressembler :
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
Je n'avais pas de Carte SD pratique pour revoir son structure de répertoire hiérarchique et en tant que tel, j'utilise un DMG image montés et patchés comme indiqué dans le fichier journal sortie ci-dessus.
L'ensemble de test de images était un très petit échantillon, néanmoins la code La logique fonctionne aussi vite que le code.
Dans le exemple Automator flux de travail l'image ci-dessous, il y a une déconnexion évidente au centre entre certains des éléments de l'image. actions . Ceci est voulu et dû à : Options -- [] Ignorer l'entrée de cette action
Note : Le <em>exemple </em><strong>shell script </strong><em>code </em>y <em>exemple </em><strong>AppleScript </strong><em>code </em>est juste cela et sans aucune inclusion <em>gestion des erreurs </em>ne contient pas d'autres <em>gestion des erreurs </em>comme il se doit. C'est à l'utilisateur qu'il incombe d'ajouter toute <em>traitement des erreurs </em>selon ce qui est approprié, nécessaire ou souhaité.
Pour <strong>AppleScript </strong><em>gestion des erreurs </em>... Jetez un coup d'œil à 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>essayez </strong></a><em>déclaration </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>erreur </strong></a><em>déclaration </em>dans le <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html" rel="nofollow noreferrer"><strong>Guide du langage AppleScript </strong></a>. Voir aussi, <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>Travailler avec des erreurs </strong></a>. En outre, l'utilisation de la <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>retarder </strong></a><em>commande </em>peut être nécessaire entre les événements, le cas échéant, par ex. <code>delay 0.5</code> avec le <em>valeur </em>de la <em>retarder </em>définis de manière appropriée.