有没有办法复制整个目录,但只复制文件夹?我的目录中某处有一个损坏的文件,导致我的硬盘出现故障。
因此,我不想将损坏的文件复制到另一个硬盘,而只想复制文件夹,因为我有搜索数百个文件夹的脚本,而且我不想手动创建所有文件夹。
我确实搜索了 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))