![如果我的 RAM 大小为 8GB,如何将 12GB 文件从 Ubuntu 19.10 复制到 Android](https://linux22.com/image/921117/%E5%A6%82%E6%9E%9C%E6%88%91%E7%9A%84%20RAM%20%E5%A4%A7%E5%B0%8F%E4%B8%BA%208GB%EF%BC%8C%E5%A6%82%E4%BD%95%E5%B0%86%2012GB%20%E6%96%87%E4%BB%B6%E4%BB%8E%20Ubuntu%2019.10%20%E5%A4%8D%E5%88%B6%E5%88%B0%20Android.png)
我尝试了不同的选项将 12GB 的电影从 Ubuntu 复制到 Android(作为相机连接以获得可靠的连接,mtp 情况更糟),但令我惊讶的是,存在 RAM + SWAP 短缺的问题(总共 16GB 减去已使用部分)问题显示在图片上: RAM+SWAP 占用 99.9%。复制过程继续,Ubuntu 挂起一分钟,然后出现错误(或不出现)。
尝试复制:
- 文件应用程序
- DC 应用程序(显示流错误)
- cp、rsync、dd
对我来说一切都不起作用,结果相同——内存已满,复制停止。
有什么想法如何使用 Ubuntu 简单地复制大文件?
答案1
1/ 您只需使用以下命令分割文件:
zip --split-size 1g zipfilename name_of_your_movie
这会将您的文件拆分为多个 1Gb 的压缩部分,您可以逐个移动。
2/ 然后使用以下命令重新组装各部分:
zip --split-size 0 zipfilename.zip --out unsplitted
这将创建一个名为 unsplitted 的统一 zip 文件(如果您移动的电影是“Split”,那么这将是讽刺的:P)
3/ 解压 unsplitted.zip 文件:unzip unsplitted.zip
,瞧!
答案2
1)使用以下方法将文件拆分成两部分7Zip (手册页)- 分割文件而不进行压缩以获得最佳速度。将每个部分复制到 Android,然后使用存档器或者7zipper安装在 Android 上,将文件重新合并到您的超大电影中。
或者
2)使用开源应用程序缩小电影文件大小手刹或等效文件,大小不会失败。复制较小的文件。
或者
3)使用以下方法重新编码影片高效视频编码如果您的 Android 设备可以很好地播放 HEVC,则可以使用 Handbrake 或同等软件(又名 H.265)来缩小文件大小。我在我的 OnePlus 7Pro 上使用 VLC,HEVC 运行良好。您的里程可能会有所不同。
或者
4)绕过PC与Android设备之间的直接连接,通过WiFi进行传输。
答案3
您可以简单split
地cat
:
split --size=1G movie.mp4 movie.mp4.split
复制文件,然后在 Android 上的终端仿真器中执行以下操作:
cat movie.mp4.split* >> movie.mp4
与 zip 方法一样,这需要双倍的空间。如果您的文件非常大并且目标上没有足够的空间,您可以逐步连接每个部分,然后将其删除:
for part in movie.mp4.split*; do
cat "$part" >> movie.mp4
rm "$part"
done
现在我们可以自动化这个过程。以下sh
脚本
- 将指定文件分割成指定大小的部分
- 将所有文件放入目录中
- 生成
sh
脚本来重新组装零件
例如,调用
sh split.sh movie.mp4 100M
创建一个movie.mp4.split
包含 100MB 大小部分和一个脚本的文件夹unsplit.sh
。该脚本movie.mp4
在与相同的目录中重新组合movie.mp4.split
,然后删除自身和文件夹。
拆分.sh:
#!/bin/sh
if [ -z "$1" ] ; then
echo "Please specify the file to split"
exit 1
fi
if [ ! -f "$1" ] ; then
echo "File not found: " $1
exit 2
fi
size=1M
if [ ! -z "$2" ] ; then
size=$2
fi
filename=$(basename "$1")
dirname="$1".split
mkdir "$dirname"
split --bytes="$size" "$1" "$dirname/part"
unsplit_script="$dirname/unsplit.sh"
cat > "$unsplit_script" <<EOF
#!/bin/sh
working_dir=\$(dirname "\$0")
if [ -f "\$working_dir/../$filename" ] ; then
echo "File already exists: $filename"
exit 1
fi
for part in "\$working_dir"/part*; do
cat "\$part" >> "\$working_dir/../$filename"
rm "\$part"
done
rm "\$0"
rmdir "\$working_dir/../$dirname"
EOF
chmod +x "$unsplit_script"
exit 0