While moving selected local files and folders to iCloud I came across a folder on my Mac containing a large number of documents some of which appeared to be duplicates of those on iCloud. Before deciding which ones to move, I wanted to check each one to see if it already existed on iCloud.
A comparison of the two folders shows that of the four entries in the temp folder, the file named file.txt and the folder named folder don’t exist on iCloud.
This example only shows a fraction of the contents of each folder and so having written the Bash script below to loop through the contents of the temp folder checking for the existence of each entry on iCloud, I assumed the results would confirm the visual comparison.
#!/usr/bin/env bash
shopt -s nullglob
shopt -u dotglob
src="/Users/steve/temp"
trg="/Users/steve/Documents"
for entry in "$src"/{..?,.[!.],}*; do
name=$(basename -- "$entry")
if [ ! -e "$trg/$name" ]; then # file doesn't exist on target
echo "'$name' DOESN'T EXIST in $trg"
else
echo "'$name' already exists in $trg"
fi
done
shopt -u nullglob
shopt -s dotglob
'file.txt' DOESN'T EXIST in /Users/steve/Documents 'folder' DOESN'T EXIST in /Users/steve/Documents 'Wordpress Plugins.docx' already exists in /Users/steve/Documents 'world_cup_2018.xlsx' DOESN'T EXIST in /Users/steve/Documents
Not so. Clicking the OUTPUT tab above shows the results are as expected except for the file world_cup_2018.xlsx which the script has determined as not being on iCloud when the Finder clearly shows it is.
The clue to the script’s unexpected result is the
icon next to the world_cup_2018.xlsx file on iCloud which denotes the file has yet to be downloaded to the local drive.
Listing the Document folder’s contents on iCloud from the command line shows that such files are subject to a different naming convention not evident in the Finder where the file name is prefixed with . – traditionally denoting a hidden file – and ends with .icloud.
ls -a /Users/steve/Documents
.world_cup_2018.xlsx.icloud Wordpress Plugins.docx workout.xlsx
Ammending the script to include an additional test for this other naming convention gives the expected results:
#!/usr/bin/env bash
shopt -s nullglob
shopt -u dotglob
src="/Users/steve/temp"
trg="/Users/steve/Documents"
for entry in "$src"/{..?,.[!.],}*; do
name=$(basename -- "$entry")
if [ ! -e "$trg/$name" ] && [ ! -e "$trg/.$name.icloud" ]; then # file doesn't exist on target
echo "'$name' DOESN'T EXIST in $trg"
else
echo "'$name' already exists in $trg"
fi
done
shopt -u nullglob
shopt -s dotglob
'file.txt' DOESN'T EXIST in /Users/steve/Documents 'folder' DOESN'T EXIST in /Users/steve/Documents 'Wordpress Plugins.docx' already exists in /Users/steve/Documents 'world_cup_2018.xlsx' already exists in /Users/steve/Documents

