命令手册:逐段拆解与套用模板)
tar 打包下载命令手册逐段拆解与套用模板适用场景在 AutoDL / Linux 服务器上把文件夹打包成单文件以便下载到本地为什么要打包JupyterLab 等网页文件管理器不支持下载文件夹只能下载单个文件建立时间2026-10-15来源实例autodl-container-38ef40b880-8646dcf9一句话用途记住一条命令模板换文件夹名就能反复套用目录0. 一键套用模板1. 原命令逐段拆解1.1 七个片段的含义1.2 cf 两个字母的含义1.3 为什么执行完没有任何输出2. 为什么要排除 git 目录2.1 同一份数据在硬盘上存了两遍2.2 体积对照2.3 怎么验证自己有没有误打包2.4 什么情况下才该保留3. 为什么一律不加 z 或 J4. 关于 cd 的两点澄清4.1 波浪号和斜杠的区别4.2 结论不能直接换4.3 确实想用绝对路径怎么办5. 通用套用模板5.1 模板 A先切换目录再打包5.2 模板 B用 C 参数不改当前目录5.3 只打包某个子目录6. 常见报错排查表7. 打包后的验收清单8. 下载中断时的分卷方案9. tar 常用参数速查10. 速记卡0. 一键套用模板最常用形式只需改动三处cd文件夹所在的目录tar--exclude.git-cf输出名.tar要打包的文件夹名实例演进想打包什么命令NTURain 训练集仓库本次案例cd ~ tar --exclude.git -cf SPAC-SupplementaryMaterials.tar SPAC-SupplementaryMaterialsRainMamba 代码目录cd ~ tar --exclude.git -cf RainMamba.tar RainMambaautodl-tmp 下的数据集cd /root/autodl-tmp tar -cf mydata.tar mydata纯数据目录无 gitcd ~/data tar -cf dataset_v2.tar dataset_v2记忆口诀cd 到父目录 → tar -cf 输出名.tar 文件夹名 → 有 git 就加 --exclude.git通用写法连 cd 都省掉tar--exclude-vcs-cf输出名.tar-C父目录文件夹名--exclude-vcs会自动排除.git/.svn/.hg等所有版本控制目录比手写--exclude.git更省心。1. 原命令逐段拆解完整命令cd~tar--exclude.git-cfSPAC-SupplementaryMaterials.tar SPAC-SupplementaryMaterials1.1 七个片段的含义#片段含义1cd ~切换到当前用户家目录。root 用户 →/root。这一句必需因为后面两个路径都写成了相对形式2逻辑与前一条命令成功退出码 0才执行后一条。若cd失败tar 不会在错误目录里乱跑3tar归档工具tape archive把多个文件/目录合并成单个文件4--exclude.git排除名为.git的目录。这是glob 模式不含/时会匹配任意层级中叫.git的条目。单引号是 shell 强引用防止特殊字符被提前展开此处无特殊字符加引号属规范习惯5-cf两个选项合并写-c create创建归档-f file用文件而非标准输出必须紧跟归档名6SPAC-SupplementaryMaterials.tar输出归档文件名-f的实参7SPAC-SupplementaryMaterials要打包的源目录相对当前目录~执行后的结果位置/root/SPAC-SupplementaryMaterials.tar ← 归档文件本体604 MB └── SPAC-SupplementaryMaterials/ ← 归档内的路径前缀 └── Dataset_Training_Synthetic/ ← 33 个 rar ├── t1_Rain_01.rar └── ... ×33包内保留了目录前缀因为源参数写的是相对目录名。本地解开后得到完整目录结构不会散落一地文件。1.2 cf 两个字母的含义tar-c-fSPAC-SupplementaryMaterials.tar SPAC-SupplementaryMaterials# ↑ ↑ ↑# │ │ └── 归档文件名-f 的实参必须紧贴其后中间不能插别的选项# │ └───── 写入文件而非标准输出# └──────── 创建新归档create常见误写错误写法问题tar -c SPAC-SupplementaryMaterials.tar dir/缺-ftar 会把归档内容喷到终端屏幕上二进制乱码刷屏tar -cf dir/ SPAC-SupplementaryMaterials.tar参数顺序颠倒-f后面跟的必须是输出名不是源目录tar cf ...老式写法不带-能跑但可读性差建议统一用-cf1.3 为什么执行完没有任何输出因为没有加-vverbose。tar 在静默模式下成功时不打印任何内容——这符合 Unix 哲学“无消息即成功”No news is good news。# 想看到打包了哪些文件加 -vtar-cvfSPAC-SupplementaryMaterials.tar SPAC-SupplementaryMaterials判断成功的正确方式是看退出码而不是看有没有输出cd~tar--exclude.git-cfSPAC-SupplementaryMaterials.tar SPAC-SupplementaryMaterialsecho打包成功2. 为什么要排除 git 目录2.1 同一份数据在硬盘上存了两遍Git 的工作方式和普通文件夹不一样。以本次的稀疏检出目录为例/root/SPAC-SupplementaryMaterials/ ├── Dataset_Training_Synthetic/ ← 工作区604 MBcheckout 出来的 33 个 rar │ ├── t1_Rain_01.rar │ └── ... ×33 └── .git/ └── objects/pack/*.pack ← 对象库~603 MB同样这 33 个 rar 的另一种存放形式关键在于--filterblob:none这个参数的作用是延迟下载不是不下载clone 时只拉 8 个对象目录树信息文件内容一律不拿执行git checkout时git 才把那 603.15 MiB 的内容拉下来拉下来的内容先存进.git/objects/pack/就是传输日志里那个 603.15 MiB然后从对象库再写出一份到工作区的Dataset_Training_Synthetic/→ 同一批 rar在磁盘上占了两份。打比方.git是书店的仓库工作区是书架。你要寄给朋友的是书架上的书但不排除.git就等于把仓库连同书架一起装箱——同一批书装两遍。2.2 体积对照写法tar 体积下载风险tar --exclude.git -cf ...✅604 MB低tar -cf ...不排除 ❌~1.2 GB高——下载量翻倍中途断线概率也翻倍单个 1.2 GB 文件走网页下载基本必然要重来一两次。2.3 怎么验证自己有没有误打包先看源目录的体积构成du-h--max-depth1~/SPAC-SupplementaryMaterials|sort-h输出示例604M /root/SPAC-SupplementaryMaterials/Dataset_Training_Synthetic 605M /root/SPAC-SupplementaryMaterials/.git 1.2G /root/SPAC-SupplementaryMaterials最后一行是总数前两行各占一半。⚠️du的父目录会包含子目录所以单看总数会误以为数据有 1.2 GB其实真正需要的只有 604 MB。再看归档本身ls-l~/SPAC-SupplementaryMaterials.tartar-tf~/SPAC-SupplementaryMaterials.tar|wc-l观察项干净已排除 .git误含 .gitls -l字节数≈ 604 MB≈ 1.2 GBtar -tf | wc -l约 36 行上百行多出大量 git 内部文件⚠️ 一个反直觉的坑tar -tf xxx.tar | grep -c \.rar$这个计数无法用来判断是否误含.git。原因.git里的文件叫xxxx.pack、xxxx.idx压根不含.rar字样——两种情况数出来都是 33。要判断必须看ls -l的字节数或tar -tf | wc -l的行数。2.4 什么情况下才该保留只有一种你要在这台机器上继续做 git 操作——比如再 checkout 仓库里的其他目录测试集、代码或者git pull更新。如果目标只是把数据带回本地本地不需要这些 git 元数据本地有 WinRAR 就够了。排除还有两个附带好处包里不会夹带服务器路径、git 历史、远端地址等与研究无关的信息交付他人时更干净下载量减半3. 为什么一律不加 z 或 J写法作用本场景结果tar -cf把文件夹变成单个文件体积不变604 MB → 604 MBtar -czf打包 gzip 压缩收益 ≈ 0白烧 CPUtar -cJf打包 xz 压缩更慢收益依旧极小原因包内是已经压过的 rar内含 jpg 图片这些格式的熵值已接近极限二次压缩只能再压掉约 0.5%却要付出几十分钟 CPU 时间。必须区分两件事解决的问题tar不加 z文件夹 → 单文件这才是 AutoDL 下载限制的根源-z/-J体积太大 → 体积变小本场景不需要JupyterLab 限制的是不能下载文件夹不是只能下载压缩包。所以tar -cf完全够用。看到有人写tar -czf打 rar 包那是无意义的。特例如果打包的是大量小文本文件如几千个 .py / .txt / .json那-z是真有用的能压到 1/5 甚至更低。判断标准是内容是否已被压缩。4. 关于 cd 的两点澄清4.1 波浪号和斜杠的区别写法展开为含义~/rootroot 用户家目录home directory$HOME/root与~完全等价//文件系统根目录最顶层.当前所在目录—..上一级目录—术语澄清中文日常口语常把根目录用来指家目录~但在 Linux 语境里/才是根目录~叫家目录。两者是不同层级/ ← 根目录cd / 到这里 ├── bin/ etc/ home/ tmp/ usr/ var/ ... └── root/ ← root 用户的家目录cd ~ 到这里 ├── SPAC-SupplementaryMaterials/ ← 本次打包的目录在这里 └── autodl-tmp/4.2 结论不能直接换cd ~换成cd /会失败cd/tar--exclude.git-cfSPAC-SupplementaryMaterials.tar SPAC-SupplementaryMaterials# tar: SPAC-SupplementaryMaterials: Cannot stat: No such file or directory原因SPAC-SupplementaryMaterials在/root/下不在/下。cd /之后 tar 在当前目录/里找不到这个相对路径。反证本次命令是从/提示符出发的——root...:/# cd ~ tar --exclude.git -cf ... root...:~# ← 提示符变成 ~说明 cd 确实切到了 /root 并成功找到目录如果目录真在/下cd ~反而会失败。验证方法ls-d/root/SPAC-SupplementaryMaterials# 存在 ✅ls-d/SPAC-SupplementaryMaterials# 不存在 ❌4.3 确实想用绝对路径怎么办有两种写法效果不同写法一源也用绝对路径cd/tar--exclude.git-cf/root/SPAC-SupplementaryMaterials.tar /root/SPAC-SupplementaryMaterials能跑但 GNU tar 会打印警告tar: Removing leading / from member names因为 Tar 格式不存储绝对路径避免解压时覆盖系统文件。结果是包内路径变成root/SPAC-SupplementaryMaterials/...本地解开后多出一层root/目录不够干净。写法二用-C参数推荐tar--exclude.git-cf~/SPAC-SupplementaryMaterials.tar-C~ SPAC-SupplementaryMaterials-C ~让 tar 在读取文件之前切换到~效果等同于cd ~但归档内的路径仍然是干净的相对路径。这是脚本里最推荐的写法——不改变当前所在目录。5. 通用套用模板5.1 模板 A先切换目录再打包适合交互式终端使用最直观cd文件夹所在目录tar--exclude.git-cf输出名.tar文件夹名要点cd的目标是父目录不是文件夹本身最后两个参数都是相对于 cd 之后目录的路径输出名建议写简单点不要带/否则会跑到别处# 正例cd~tar--exclude.git-cfRainMamba.tar RainMamba# 反例cd 进了文件夹本身然后又找同名子目录 → 必然失败cd~/RainMambatar-cfRainMamba.tar RainMamba5.2 模板 B用 C 参数不改当前目录适合写进脚本 / 连续打包多个目录tar--exclude-vcs-cf输出名.tar-C父目录文件夹名实例——一次打包三个目录tar--exclude-vcs-cf/root/backup_1.tar-C/root RainMambatar--exclude-vcs-cf/root/backup_2.tar-C/root DRSformertar--exclude-vcs-cf/root/backup_3.tar-C/root/autodl-tmp mydata注意-C的相对路径陷阱多个-C会累积第二次-C是相对第一次的结果。安全做法是每个-C都用绝对路径。5.3 只打包某个子目录场景只想把Dataset_Training_Synthetic带走不要外层仓库结构。tar-cf~/NTURain_train.tar-C~/SPAC-SupplementaryMaterials Dataset_Training_Synthetic解读-C ~/SPAC-SupplementaryMaterials先切进仓库目录然后打包其下的Dataset_Training_Synthetic。得到 604 MB 的包解开后直接就是Dataset_Training_Synthetic/少一层嵌套。6. 常见报错排查表报错 / 现象原因解决Cannot stat: No such file or directory源目录路径不对相对路径基于错误的当前目录pwdls确认位置或用绝对路径 -CRemoving leading / from member names用绝对路径作源参数无害但包内会多出root/层级改用-C更干净Cowardly refusing to create an empty archive源写成了不存在或空的路径检查拼写确认目录非空终端刷出大量二进制乱码忘了-f归档内容输出到了屏幕加-f 输出名打完包提示符没变、命令像没反应tar 静默模式正常行为加 echo OK确认或查退出码echo $?归档体积是预期的两倍没排除.git加--exclude.git或--exclude-vcs打包耗时极长、CPU 飙高误加了z/J去掉压缩选项解开后多一层同名目录源参数写的是目录名本身正常若想少一层用-C 父目录 子目录归档里出现了./开头的路径用了tar -cf x.tar .改用明确的目录名7. 打包后的验收清单打包完成后服务器端ls-lh~/SPAC-SupplementaryMaterials.tartar-tf~/SPAC-SupplementaryMaterials.tar|head-5tar-tf~/SPAC-SupplementaryMaterials.tar|grep-c\.rar$检查项期望值ls -lh体积≈ 604 MB若 1.2 GB 说明含了.gittar -tf | head -5正常显示SPAC-SupplementaryMaterials/...路径grep -c \.rar$33本次数据集的 rar 总数记录字节数供下载后比对ls-l~/SPAC-SupplementaryMaterials.tar|awk{print $5}→ 把这个数字抄下来。下载完成后本地端ls-lSPAC-SupplementaryMaterials.tar→字节数与服务器端完全一致才算下载成功。⚠️这是本手册最重要的一条不要靠能打开判断完整性。历史教训是一次下载的文件恰好截断在整数 MiB 边界上340,787,200 字节 恰好 325 MiB看起来大小正常实际已损坏WinRAR 报不可预料的压缩文件末端。必须对数字。可选用 MD5 做终极校验# 服务器端md5sum ~/SPAC-SupplementaryMaterials.tar# 本地端Git Bashmd5sum SPAC-SupplementaryMaterials.tar# 本地端PowerShell输出大写内容相同Get-FileHash-AlgorithmMD5.\SPAC-SupplementaryMaterials.tar8. 下载中断时的分卷方案症状单文件走网页下载反复中断或下完发现大小对不上。对策切分成多个小卷只重下失败的那一卷。第一步算清楚要切几卷604 MB 575.5 MiB 200 MiB × 3 600 MiB 575.5 MiB → 分 3 卷part00(200M) part01(200M) part02(175.5M)第二步切分cd~split-b200M-d-a2SPAC-SupplementaryMaterials.tar SPAC-SupplementaryMaterials.tar.partls-lh~/SPAC-SupplementaryMaterials.tar.part*-b 200M每卷 200 MiB -d用数字后缀 -a 2后缀两位数00/01/02第三步逐卷下载网页下载 3 个文件比下 1 个大文件稳第四步本地合并# Git Bashcd本地下载目录catSPAC-SupplementaryMaterials.tar.part00 SPAC-SupplementaryMaterials.tar.part01 SPAC-SupplementaryMaterials.tar.part02SPAC-SupplementaryMaterials.tar⚠️必须按 part00 → part01 → part02 顺序写不要图省事写cat *.part*某些排序下会错乱。# 或 Windows CMDcopy /b part00part01part02 SPAC-SupplementaryMaterials.tar第五步校验md5sum SPAC-SupplementaryMaterials.tar# 与服务器端 md5sum 对拍tar-tfSPAC-SupplementaryMaterials.tar|grep-c\.rar$# 应为 33分卷方案的核心价值某一卷下载失败时只需重下该卷200 MB不必整体重来604 MB。9. tar 常用参数速查参数全称含义-ccreate创建新归档-ffile指定归档文件名必须紧跟文件名-vverbose打印处理的文件列表-tlist列出归档内容不解开-xextract展开归档-Cdirectory切换目录读取前 / 写出前--exclude—排除匹配的条目glob 模式--exclude-vcs—自动排除.git/.svn/.hg/.bzr等版本控制目录 ✅ 推荐-ppreserve保留权限信息-zgzipgzip 压缩 ⚠️ 本场景不用-Jxzxz 压缩 ⚠️ 本场景不用-rappend向已有归档追加文件-uupdate只追加比归档中更新的文件必记的三组tar-cfout.tar dir/# 打包最常用tar-tfout.tar# 查看内容不展开tar-xfout.tar# 展开10. 速记卡日常场景 → 直接抄# ① 打包某个文件夹排除 git最常用cd~tar--exclude.git-cf输出名.tar 文件夹名# ② 打包但不改变当前目录脚本友好tar--exclude-vcs-cf~/输出名.tar-C~ 文件夹名# ③ 只打包仓库里的某个子目录tar-cf~/输出名.tar-C~/仓库名 子目录名# ④ 查看包内容 / 体积 / 文件数tar-tf~/输出名.tar|head-5ls-lh~/输出名.tartar-tf~/输出名.tar|wc-l# ⑤ 下载前先记字节数供本地比对ls-l~/输出名.tar|awk{print $5}# ⑥ 下载中断就分卷split-b200M-d-a2~/输出名.tar ~/输出名.tar.part四条铁律cd到父目录不是文件夹本身有.git就加--exclude.git否则体积翻倍永远不加zrar/jpg 已压缩白烧 CPU下载后对字节数不要靠能打开three 个最容易混淆的路径写法实际位置~/root家目录/文件系统最顶层不是你的文件所在处.当前目录文档结束 · 2026-10-15