网站首页 > 技术文章 正文
- 使用 cpio 程序:
cd -- "$srcdir" &&
find . -type d -print | cpio -dumpv -- "$dstdir"
- 或者使用 pax 程序:
cd -- "$srcdir" &&
find . -type d -print | pax -rwdv -- "$dstdir"
- 或者使用 GNU tar 和更详细的语法:
cd -- "$srcdir" &&
find . -type d -print | tar c --files-from - --no-recursion |
tar x --directory "$dstdir"
这个方法使用 find 创建一个目录名称列表,将只添加目录到归档文件中,并将其传输到第二个 tar 实例以在目标位置解压。可以看出,tar 最不适合此任务,但由于人们普遍喜爱它,因此在这里介绍以满足 tar 粉丝的需求。(注意:使用典型的 Unix tar 完全无法完成此任务。另请注意:“标准 tar”并不存在,因为 POSIX 故意省略了 tar 和 cpio,选择了 pax。)
上述所有解决方案在目录名称包含换行符时会失败。在许多现代 BSD/GNU 系统上,可以轻松修改这些解决方案以处理这种情况,方法是使用 find -print0 和 pax -0 或 cpio -0 或 tar --null(请查看您的系统文档,了解您的系统支持哪些命令以及可用的扩展)。如果您确实无法使用这些选项,那么您可能至少可以使用 ! -path ' \n' -prune -o -type d -print(而不是 -type d -print),以忽略路径中包含换行符的目录。请确保以 C/POSIX 区域设置运行 find,以排除包含换行符以及用户区域设置中无效字符序列的文件路径。
- 使用 find:
export dstdir
mkdir -p -- "$dstdir" &&
cd -- "$srcdir" &&
find . -type d -exec sh -c \
'cd -- "$dstdir" && mkdir -- "$@"' sh {} +
或者使用 bash 4 的 globstar:
shopt -s globstar nullglob &&
cd -- "$srcdir" && dirs=(**/) && (( ${#dirs[@]} )) &&
cd -- "$dstdir" && mkdir -- "${dirs[@]}"
(请注意,这也会将符号链接复制为目录;旧版本的 bash 在遍历目录树时也会遍历符号链接)。
- 或者使用 zsh 的递归通配符和通配符修饰符:
export srcdir dstdir
zsh -ec '
cd -- "$srcdir"
dirs=(**/*(/D))
cd -- "$dstdir"
mkdir -- $dirs'
- 如果您想要创建占位文件而不是完整大小的文件,以下可能是最简单的解决方案。find 命令使用“虚拟”文件(具有相同时间戳的空文件)重新创建常规文件:
cd -- "$srcdir" &&
DSTDIR=$dstdir find . -type f -exec sh -c \
'for i do touch -r "$i" -- "$DSTDIR/$i"; done' sh {} +
如果您的 find 无法处理 -exec +,则可以在命令的末尾使用 ; 替代 +。
如果您觉得文章内容对你有一点帮助可以关注我,我在头条平台会持续分享更多实用的shell技巧和最佳实践,如果想系统的快速学习shell的各种高阶用法和生产环境避坑指南可以看看《shell脚本编程最佳实践》专栏,专栏里有更多的实用小技巧和脚本代码分享。
猜你喜欢
- 2025-07-19 当后端说"接口没问题"时,我默默打开了curl
- 2025-07-19 第四章 Linux常用shell命令-4.5.磁盘管理
- 2025-07-19 Hadoop学习---HDFS的常用shell命令详解
- 2025-07-19 电脑总是提示flash版本过低或是没有安装Flash,怎么办
- 2025-07-19 Vanilla OS 2.0将从Ubuntu迁移到Debian
- 2025-07-19 最美的Linux:Elementary OS公测版开放下载
- 2025-07-19 Linux下使用Speedtest测试网速(linux网速测试脚本)
- 2025-07-19 微软或因WCOS开发停滞而取消Surface Hub 2X项目
- 2025-07-19 常用设计标准,阀门常用材料、连接形式、材料及表面硬化处理
- 2025-07-19 Shell脚本编程:7个提高效率的自动化脚本
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 569℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 511℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 485℃启用MySQL查询缓存(mysql8.0查询缓存)
- 468℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 447℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 445℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (83)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)