网站首页 > 文章精选 正文
- 使用 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-07 了解Linux目录,那你就了解了一半的Linux系统
- 2025-07-07 Linux 中,查找文件指令用法解析(linux查找文件命令locate)
- 2025-07-07 Linux系统下批量克隆目录结构,在另一台Linux下创建同样的目录
- 2025-07-07 跟老韩学Linux,find指令or的实例
- 2025-07-07 Linux系统操作命令之find最佳实践
- 2025-07-07 软网推荐:一个软件提取所有图标(如何提取软件图标)
- 2025-07-07 Linux:命令 stat 显示文件的状态信息,命令 find 搜索文件详解
- 2025-07-07 linux的查查大法(linux操作系统查询命令)
- 2025-07-07 浅聊find_package命令的搜索模式(Search Modes)
- 2025-07-07 超级好用的C++实用库之文件目录操作
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)