如何基于cp -v的输出,按原复制顺序续传桌面Sambashare共享文件至笔记本?
兄弟误关笔记本导致复制中断确实头疼,不过好在你用了cp -v,有输出记录可以利用,咱们一步步来搞定续传:
第一步:定位最后成功复制的文件
首先得明确最后一个已经复制完成的文件:
- 如果你当时把
cp -v的输出重定向到了日志文件(比如当初用的是cp -v /path/to/source/* /path/to/dest > copy_log.txt),直接用tail -n 1 copy_log.txt就能看到最后一行输出,格式大概是'源文件路径' -> '目标文件路径',把这里的源文件名记下来(比如photo_2024.jpg)。 - 如果没保存日志,就去终端的滚动记录里找最后一行
cp -v的输出,同样记下那个源文件名。 - 保险起见,先去目标目录确认这个文件确实存在且完整,可以用
ls -l ~/laptop_files/目标文件名对比源文件的大小,确保已经复制完成。
第二步:生成剩余待复制的文件列表(保持原顺序)
因为cp默认是按照Shell展开文件的顺序(通常是字母顺序)来复制的,咱们要复刻这个顺序,只保留最后复制文件之后的内容:
- 先把源目录的所有文件按原顺序导出到一个列表文件:
这里ls -1 /mnt/sambashare/desktop_files > full_file_list.txtls -1是让每个文件占一行,顺序和你当初用cp *时的顺序完全一致。 - 从列表里截取最后复制文件之后的所有文件(跳过已复制的那个):
假设最后复制的文件是photo_2024.jpg,用awk命令直接生成剩余列表:
这条命令的意思是:找到匹配awk '/photo_2024.jpg/{f=1;next}f' full_file_list.txt > remaining_files.txtphoto_2024.jpg的行后,开始标记后续行,跳过当前行(因为已经复制了),把后面的所有行输出到remaining_files.txt里。
第三步:按原顺序续传文件
现在用这个剩余列表来批量复制,推荐用while循环(能处理带空格、特殊字符的文件名,比xargs更稳妥):
while IFS= read -r filename; do cp -v "/mnt/sambashare/desktop_files/$filename" "~/laptop_files/" done < remaining_files.txt
执行这个脚本后,就会从上次中断的位置继续,完全按照当初cp的顺序来复制。
额外推荐:用rsync更省心(如果对顺序要求不严格)
如果你不是必须严格遵循当初cp的复制顺序,rsync是更可靠的选择——它会自动对比源和目标目录,只复制缺失或不完整的文件,还支持断点续传,命令很简单:
rsync -av --progress /mnt/sambashare/desktop_files/ ~/laptop_files/
这里-a是递归+保留权限等属性,-v显示详细信息,--progress显示复制进度,用它可以不用手动找最后复制的文件,直接搞定所有未完成的复制。
备注:内容来源于stack exchange,提问作者Dragin
相关产品推荐
相关产品推荐

