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

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

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

因此,我不想将损坏的文件复制到另一个硬盘,而只想复制文件夹,因为我有搜索数百个文件夹的脚本,而且我不想手动创建所有文件夹。

我确实搜索了 cp 手册,但没有看到任何内容(我可能错过了)

假设我的故障硬盘上有这个结构:

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

我想要的只是目录结构,而不是任何文件。

因此我最终会在新的硬盘上得到以下信息:

dir1
    dir2
        dir4
dir3

希望有人知道一些技巧!

答案1

如果您想要镜像目​​录骨架但不复制任何文件:

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 

在具有数千个目录的实际解决方案中,这种情况只会变得更好。

答案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)) 

相关内容