仅复制文件夹而不复制文件?


16

有没有办法复制整个目录,但仅复制文件夹?我的目录中某处有损坏的文件,这导致我的硬盘出现故障。

因此,我没有复制损坏的文件到另一个硬盘,而是只复制了文件夹,因为我有可以搜索数百个文件夹的脚本,并且我不需要手动创建它们。

我确实搜索了cp手册,但是什么也看不到(我可能错过了)

说我在失败的硬盘上有以下结构:

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

我想要的只是目录结构,根本没有任何文件。

因此,我最终使用了新的硬盘:

dir1
    dir2
        dir4
dir3

希望有人知道一些把戏!


您是要复制目录结构还是要排除当前工作目录中的文件(更深的子目录中的所有其他文件都是游戏)?
奥利

我加了一个例子。很抱歉感到困惑
Shannon

1
仅供参考,用于rsync复制目录结构并保留权限和属性](stackoverflow.com/a/9242883/52074)。使用纯mkdir -p 文本不会保留权限和属性
Trevor Boyd Smith,

Answers:


15

如果要镜像目录框架而不复制任何文件:

find -type d -links 2 -exec mkdir -p "/path/to/backup/{}" \;

这里发生了什么:

  • 查找仅选择目录
  • 我们正在-links 2寻找最深的目录
  • mkdir -p 会在途中丢失任何目录。

我这样做是这样,而不是find -type d -exec mkdir -p "/path/to/backup/{}" \;因为这样会减少大量的mkdir呼叫。我们可以通过一些测试迅速证明这一点。这是测试树,后面是我用来比较两个命令的测试树:

$ tree
.
├── dir1
│   ├── dir2
│   │   └── dir3
│   ├── dir7
│   └── dir8
└── dir9
    └── dir0

$ pr -m -t <(find -type d) <(find -type d -links 2)
.                               ./dir1/dir8
./dir1                          ./dir1/dir2/dir3
./dir1/dir8                     ./dir1/dir7
./dir1/dir2                     ./dir9/dir0
./dir1/dir2/dir3
./dir1/dir7
./dir9                  
./dir9/dir0 

在具有成千上万个目录的实词解决方案中,这只会变得更好。


这是我的菜鸟,但是如何搜索旧目录以复制到备份?我在这里只能看到一条路
Shannon

如果未指定路径,请find使用当前工作目录作为起点。如果您想使用其他路径,请使用以下语法:find /path/to/search/ -type.....
Oli

所以我将目录设置到某个文件夹,其中包含我要复制,运行的框架find -type d -exec mkdir -p "/media/jinglez/TVSeries/TV Series"/{}" \;,一切都可以吗?似乎要
Shannon

我是从普通终端运行的,对吗?
香农

1
它们都特定于find的exec子句。{}表示当前的“找到的”文件名和\;只是结束该子句的转义。从外观上看,您的代码中还有一个多余的“不好”,我敢肯定...应该读为:find -type d -links 2 -exec mkdir -p "/media/jinglez/TVSeries/TV Series/{}" \;
Oli

2

使用python一线式代码很容易做到:

bash-4.3$ tree
.
├── ABC
├── set_pathname_icon.py
├── subdir1
│   ├── file1.abc
│   └── file2.abc
├── subdir2
│   ├── file1.abc
│   └── file2.abc
└── subdir3
    └── subdir4
        └── file1.txt

4 directories, 7 files
bash-4.3$ python -c 'import os,sys;dirs=[ r for r,s,f in os.walk(".") if r != "."];[os.makedirs(os.path.join(sys.argv[1],i)) for i in dirs]' ~/new_destination
bash-4.3$ tree ~/new_destination
/home/xieerqi/new_destination
├── subdir1
├── subdir2
└── subdir3
    └── subdir4

作为脚本,可以这样重写:

#!/usr/bin/env python
import os,sys
dirs=[ r for r,s,f in os.walk(".") if r != "."]
for i in dirs:
    os.makedirs(os.path.join(sys.argv[1],i)) 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.