Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >批量导出 ICloud 照片到本地

批量导出 ICloud 照片到本地

原创
作者头像
颇忒脱
修改于 2023-09-12 02:54:44
修改于 2023-09-12 02:54:44
1.1K0
举报

阻止 iPhone 用户切换到华为用户的最大障碍就是 iCloud 上的照片无法导出。

8月29日,华为 Mate60 Pro正式开售。

本文讲解怎么在 OS X 上使用 boredazfcuk/icloudpd 把 iCloud 的照片全部导出,再配合 迁移iPhone手机短信到华为手机,可以让你无痛切换到华为手机。

再次注意,本文是在 Mac 上试验的,Linux 也许可以直接用,Windows 我就不知道了。

步骤

1)先随便进入到一个目录,新建 icloud 目录

代码语言:shell
AI代码解释
复制
# 1 先随便进入到一个目录,新建 icloud 目录
mkdir icloud
chmod 777 icloud

2)创建 Docker 容器,并进入容器,之后的步骤都在容器内执行

代码语言:shell
AI代码解释
复制
docker network create \
   --driver=bridge \
   --subnet=192.168.115.0/24 \
   --gateway=192.168.115.254 \
   --opt com.docker.network.bridge.name=icloudpd_br0 \
   icloudpd_bridge

docker run -it \
   --name icloudpd \
   --hostname icloudpd_boredazfcuk \
   --network icloudpd_bridge \
   --restart=always \
   --env TZ=Asia/Shanghai \
   --volume icloudpd_config:/config \
   --volume $(pwd)/icloud:/home/user/iCloud \
   boredazfcuk/icloudpd \
   /bin/sh

3)注意观察 /home/user/iCloud 这个目录的权限, 因为这个目录的卷是 host 上的目录 (注意上面的 --volume $(pwd)/icloud:/home/user/iCloud 参数):

比如下面得到 /home/user/iCloud 目录所属用户的 uid 是 501、所属用户组是 dialout

代码语言:shell
AI代码解释
复制
$ ls -l /home/user
total 4
drwx------ 1 501 dialout 480 Sep 11 13:41 iCloud

接下来你要定好 uid用户名gid用户组名 这4个参数:

  • 如果直接看到了 uid,说明用户不存在,那用户名可以定死为 tmp_user
  • 如果直接看到了 gid,说明用户组不存在,那么用户组名可以定死为 tmp_group
  • 如果看到了用户名,那么 uid 通过下面脚本得到,即使用容器系统原有的用户,下面的 501 就是 uid
代码语言:shell
AI代码解释
复制
$ cat /etc/passwd | grep 用户名
用户名: x:501:20::/home/somebody:/bin/ash
  • 如果看到了用户组名,那么 gid 通过下面脚本得到,即使用容器系统原有的用户组,下面的 20 就是 gid
代码语言:shell
AI代码解释
复制
$ cat /etc/group | grep 用户组名
用户组名: x:20:root

把结果填写在这张表里:

user

uid

group

gid

4)创建脚本配置文件,你需要填写的部分是:

  • apple_id,这个是你的 apple 账号的名称,比如手机号或者邮箱号,自行在手机的设置界面里查看
  • uesr,填写之前确定的 用户名
  • user_id,填写之前确定的uid
  • group,填写之前确定的 用户组名
  • group_id,填写之前确定的 gid
代码语言:shell
AI代码解释
复制
cat <<EOF > /config/icloudpd.conf
download_path=/home/user/iCloud
apple_id=
user=user
user_id=501
group=dialout
group_id=20
TZ=Asia/Shanghai
icloud_china=True
auth_china=True
authentication_type=2FA
jpeg_quality=100
delete_accompanying=False
convert_heic_to_jpeg=False
EOF

有两个参数可以调整:

  • convert_heic_to_jpeg=True/False,是否把 HEIC 格式的照片转换一份为 JPEG 格式,
    • 我的华为 Mate60 Pro 支持 HEIC 格式照片,所以就无须转换了。
  • photo_album,指定下载哪个相册
    • 这个参数不提供就是下载所有照片,下载的照片的文件夹结构是 年/月/日,而不是相名。
    • 如果要下载相册,则必须是这种格式的 photo_album="相册1,相册2,相册名称带 空格 3"

5)初始化 iCloud cookie,这一步可能会失败,那就 rm -rf /config/* 然后重复此步骤

代码语言:shell
AI代码解释
复制
sync-icloud.sh --Initialise

程序运行会出现以下提示,按照提示输入,注意这是一个模拟登陆的过程,有可能会让你输入两次验证码,照输就是:

代码语言:shell
AI代码解释
复制
Enter iCloud password for xxxx: 输入 apple 账号密码 <回车>
Save password in keyring? [y/N]: 输入 y <回车>
Two-factor authentication required.
Enter the code you received of one of your approved devices: 输入验证码 <回车>
Code validation result: True

出现以下提示则说明获取 cookie 成功

代码语言:txt
AI代码解释
复制
2023-09-01 14:23:18 INFO     Two factor authentication cookie generated. Sync should now be successful
2023-09-01 14:23:18 INFO     Container initialisation complete

6)下载 iCloud 照片

先给 home/user/iCloud 目录建一个文件,否则脚本不会用户组名照片:

代码语言:shell
AI代码解释
复制
touch /home/user/iCloud/.mounted

然后开始下载,过程很漫长,我8千张照片下载了10个小时:

代码语言:shell
AI代码解释
复制
sync-icloud.sh

7)整理目录结构

因为下载的照片目录结构是按照年月日分级的:

代码语言:shell
AI代码解释
复制
.
├── 2021
└── 2022
    ├── 09
    │   ├── 11
    │   └── 12
    └── 10
        ├── 01
        └── 28

想办法扁平化一些,比如就按照年份来。

那就先按照年份创建一套新目录,比如:

代码语言:shell
AI代码解释
复制
mkdir -p flat/2021 flat/2022

按照年份把一个一个照片复制过去:

代码语言:shell
AI代码解释
复制
export yr=2021; find $yr -type f -not -name '.DS_Store' | xargs -n1 -I{} cp {} flat/$yr/

之后所有文件都在 flat 目录下,且目录结构如下:

代码语言:shell
AI代码解释
复制
flat
  ├── 2019
  ├── 2021
  ├── 2022
  └── 2023

注意,不过这样做有风险,因为 iCloud 上的照片可能重名,会导致丢失文件,通过下面命令检查一下扁平化前后文件数量是否一致:

代码语言:shell
AI代码解释
复制
# 扁平化之前的文件数量
export yr=2021; find $yr -type f -not -name '.DS_Store' | wc -l
# 扁平化之后的文件数量
export yr=2021; find flat/$yr -type f -not -name '.DS_Store' | wc -l

8)使用在 Mac 上安装华为手机助手,把导出的照片上传到华为手机上的 Pictures 目录,有 4 个坑:

  • Mac 上的华为手机助手无法直接上传目录
  • Mac 上的华为手机助手照片传了千把张之后,就再也无法传上去了,提示失败
  • 你得找一个真 USB 3.2/3.1 的数据线,否则传输速度很慢(也许是 USB 2.0 的速度,我8千张照片+视频传了5个小时)
  • 你可以通过网络上传,毕竟比 USB 2.0 的速度快多了,但是:
    • 在华为手机上开启 华为分享-共享至电脑,然后 Mac 打开 Finder - 网络,通过 SMB 协议访问华为手机是不行的
    • 但是,在 Mac 上 系统偏好设置 - 共享 - 文件共享 - 选项 - 使用 SMB 共享,然后华为手机 文件管理 - 网络邻居 访问 Mac 是可以的

如何清理

如果你想重新来过,在宿主机上执行以下命令:

代码语言:shell
AI代码解释
复制
docker rm -f icloudpd
docker volume rm icloudpd_config
rm -rf icloud/*

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Centos7用户基本权限轻松管理篇
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/learner198461/article/details/79714911
拓荒者
2019/03/16
2.5K0
Centos7用户基本权限轻松管理篇
趣谈Linux用户管理
没错就是他,Linux中最厉害的用户,没有之一,维护世界和平,维护系统治安可以对全部用户、全部目录、全部文件等等为所欲为的超级用户,英文名称root。
闫同学
2023/11/08
3460
用户管理
生物信息分析平台可以同时提供给多个用户使用,如果想要使用服务器,必须以一个用户的身份登录,现代操作系统一般属于多用户的操作系统,也就是说,同一台机器可以多个用户同时使用,一般这些用户都是为普通用户,这些普通用户能同时登录这台计算机,计算机对这些用户分配一定的资源,普通用户在所分配到的资源内进行各自的操作。因为是多用户操作,就需要进行用户管理,包括用户的创建删除,分组管理,权限设置,资源分配等。Linux系统中引入 root 用户来进行管理。一个系统只有一个 root 账户,此用户是唯一的,拥有系统的所有权限。这个 root 用户我们也叫做超级用户。使用 root 账户一定要小心,拥有 root密码就意味着拥有了这台计算机上所有用户的所有数据。
生信喵实验柴
2022/10/25
1.2K0
用户管理
linuxNote1_用户管理
命令用于删除用户,在执行操作的时候,该用户的家目录默认被保存,参数-r可以强制删除
皮大大
2021/03/01
5010
Linux下用户及用户权限管理
虽然很早就开始接触和使用Linux系列的系统,但是一直都是停留在使用层面,只能作为一个User,而并不是一个Developer,而要真正掌握Linux系列的系统,并以其作为开发环境进行开发,有很多知识是必须要了解的,就比如用户及用户权限管理。 用户和用户组文件 在linux中,用户帐号,用户密码,用户组信息和用户组密码均是存放在不同的配置文件中的。 在linux系统中,所创建的用户帐号和其相关信息(密码除外)均是存放在/etc/passwd配置文件中。由于所有用户对passwd文件均有读取的权限,因此
李郑
2018/03/01
6.8K0
Linux用户管理命令
Linux 系统的管理员之所以是 root,并不是因为名字叫 root,而是因为该用户的身份号码即 UID(User IDentification)的数值为 0。在 Linux 系统中 UID 就像我们的身份证号码一样具有唯一性,因此可通过用户的 UID 值来判断用户身份。在 RHEL 8 系统中,用户身份有下面这些。
张旭博客
2022/12/29
2.4K0
Linux用户管理命令
linux 用户及用户组相关指令
Linux用户只有两个等级:root及非root。Linux中还有一部分用户,如:apache、mysql、nobody、ftp等,这些也都是非root用户,即普通用户。Linux的权限实际是上不同用户所能访问的文件的不同产生的假象。而这些假象的造成,还要涉及到另外一个概念:用户组
用户5760343
2022/05/23
11.1K0
linux 用户及用户组相关指令
Linux修改用户名和用户组
最近安装了Red Hat Enterprise Linux 5,以作学习之用。因为安装的时候随手创建了一个用户,后来却不太满意,需要修改下用户名。摸了许久才搞定并且理解,记录如下:
全栈程序员站长
2022/09/29
3.4K0
Linux基础之用户管理
在linux中,任何一个要使用系统资源的用户,都必须首先向系统管理员(root)申请一个账号,然后以这个账号的身份进入系统。
我被狗咬了
2019/09/23
7120
Linux基础之用户管理
浅谈linux用户与用户组的概念
1.用户 用户是能够获取系统资源的权限的集合. .linux用户组的分类: a.管理员 root :具有使用系统所有权限的用户,其UID 为0. b.普通用户 : 即一般用户,其使用系统的权限受限,其UID为500-60000之间. c.系统用户 :保障系统运行的用户,一般不提供密码登录系统,其UID为1-499之间. 与用户有关的文件/etc/passwd,/etc/shadow a./etc/passwd文件: 其格式:ac
小小科
2018/05/04
1.4K0
统信服务器操作系统【用户账户密码策略管理】
Linux系统中每个普通用户都有一个账号,包括用户名、密码和主目录等信息。除此之外,还有一些系统本身创建的特殊用户,具有特殊的存在意义,其中最重要的用户就是管理员账户,默认的用户名为root(也就是超级用户)。通过操作命令行能够对用户文件进行创建、修改、删除更改密码等操作。
Kevin song
2024/05/30
1.5K0
统信服务器操作系统【用户账户密码策略管理】
linux中useradd命令15个实际示例
[ You might also like: [How to Add or Remove a User from a Group in Linux]( "How to Add or Remove a User from a Group in Linux") ]
入门笔记
2022/06/02
1.9K0
深入理解 Linux 用户和用户组的基本概念 + 相关命令 (一篇就够)
Linux是一个多用户多任务的操作系统,每个用户都需要一个账户才能登录系统并使用系统的资源
神秘泣男子
2024/06/03
1K0
深入理解 Linux 用户和用户组的基本概念 + 相关命令 (一篇就够)
【Linux】Linux用户与用户组那些事
抛开进程不说 ,系统上的所有文件也都有所属的用户,和用户组。用户能否访问文件正是由文件的所属用户和用户组的权限决定。
一名白帽的成长史
2019/10/08
11.3K0
【Linux】Linux用户与用户组那些事
Linux 用户管理
Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户9615083
2022/12/25
4.8K0
Linux 用户管理
Linux——用户管理
/etc/passwd 从文件名称看是存储密码相关的,但是这个已经是历史,心在主要存储的使用户名称
羊羽shine
2019/05/28
4K0
Linux 串口的基本用法
minicom minicom 是一款启动速度快,功能强大的串口终端调试工具,当然缺点就是纯字符界面,没有图形界面的调试工具看起来直观方便,但是它功能十分强大,并且在一些没有屏幕的嵌入式主板上运行颇有用处。 cutecom Linux系统可视化串口应用软件,使用上与Windows系统串口调试工具。 picocom 效果上类似 minicom 的精简版,设置比较简单,还可以有背景颜色。
怪兽
2023/02/02
10.6K0
linux和windows互传文件,用户配置文件和密码配置文件,用户组和用户管理
同样的也会弹出一个界面让你选择需要传递到Linux上的文件,文件保存的路径是你Linux当前输入此命令的路径
端碗吹水
2020/09/23
2.1K0
linux和windows互传文件,用户配置文件和密码配置文件,用户组和用户管理
Linux系统下的用户管理模式
linux是分时多用户操作系统。可以同时为几个、几十个甚至几百个用户服务。也就是同时可以有多个账号登录。一个linux终端可以登录多个用户,一个用户可以在多个Linux终端同时登录。
炒香菇的书呆子
2024/07/27
1990
Linux用户权限管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管 理员申请一个账号,然后以这个账号的身份进入系统。
星陨1357
2023/03/14
16.1K0
Linux用户权限管理
相关推荐
Centos7用户基本权限轻松管理篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档