前段时间整理云服务器的项目文件,需要批量迁移完整的程序目录,反复踩坑后彻底摸清了linux如何复制文件夹的实操方法,之前一直混用文件复制命令,每次都复制不全,白白浪费了不少时间。
这是新手最容易踩的低级错误。
最开始操作的时候,完全没区分文件和文件夹的复制逻辑,直接用复制普通文件的cp指令,输入源文件夹路径和目标路径就回车执行。看着终端没有报错,还以为操作成功了,打开目标目录才发现,只有文件夹的外壳被复制过来,里面所有的子文件夹、嵌套配置文件全部消失,只剩几个顶层零散文件,整个项目目录直接残缺不全,根本没法正常使用。
折腾好久才搞明白,Linux系统中默认的cp命令,核心逻辑只针对单层独立文件,并不具备递归读取目录的能力,系统没办法自动遍历文件夹内部的多层目录结构,不管你的源文件夹包含多少层级的内容,不加任何参数的复制操作,最终结果都是生成一个空的同名目录,仅搬运顶层无嵌套的文件。当时看着残缺的备份目录,一度打算手动逐个复制子文件夹,可项目里十几层嵌套目录、上百个文件,手动操作不仅耗时,还极易出现遗漏和错放的问题,索性彻底停下无效操作,专门核对正确的执行方式。
真正能用的复制指令很简单,只需要在cp命令后加上-r递归参数,完整格式就是cp -r 源文件夹路径 目标文件夹路径。当时直接输入这条指令,等待两秒执行完成后,打开目标目录核对,所有嵌套子文件夹、隐藏配置文件、静态资源文件全部完整复刻,目录层级和原文件夹完全一致,没有任何缺失。
参数的细微差别,也会带来完全不一样的复制效果。
最开始随意切换大小写参数,把小写的-r改成大写的-R,本以为只是格式差异,结果复制完成后发现文件异常。小写r在复制时,会自动解析软链接对应的真实文件内容,适合日常项目文件夹备份;大写R则会直接保留软链接本身,不会读取链接指向的文件,用来复制项目目录会导致部分资源链接失效,那次就是因为这个小细节,重新复刻了一遍文件,才保证服务器项目正常运行。
还有个很实用的实操细节,日常复制文件夹不用额外加复杂参数。如果目标路径下已经存在同名文件夹,cp -r指令不会报错终止,也不会直接覆盖原有文件,而是将源文件夹的内容合并到已有目录中,重复文件会自动替换,新增文件会直接补充,省去了手动删除旧目录、新建目录的步骤,对于日常备份、文件迁移来说,足够便捷好用。
那天整理完所有服务器文件,关闭终端的瞬间,桌面的服务器监控窗口还在刷新数据,折腾一下午的文件夹复制问题,终究只是吃透了一个参数的用法。