Скопировать только папки не файлы?

Существует ли способ скопировать весь каталог, но только папки? У меня есть поврежденный файл где-нибудь в моем каталоге, который заставляет мои жесткие диски перестать работать.

Таким образом вместо того, чтобы копировать поврежденный файл в другой жесткий диск, я хотел просто скопировать папки, потому что у меня есть сценарии, которые ищут сотни папок, и я не хочу должным быть вручную создавать их всех.

Я действительно искал руководство CP, но ничего не мог видеть (я, возможно, пропустил его),

Скажите, что у меня есть эта структура на моем неудавшемся жестком диске:

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

Все я хотение является структурой каталогов, не любыми файлами вообще.

Таким образом, я закончил бы с на новом жестком диске:

dir1
    dir2
        dir4
dir3

Надеясь кто-то знает некоторые приемы!

16
задан 26 October 2013 в 01:45

2 ответа

Если вы хотите отразить каркас каталога и не копировать файлы:

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

Что здесь происходит:

Я сделал это так, а не 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 

И это только улучшится в реальном решении с тысячами каталогов.

0
ответ дан 26 October 2013 в 01:45

Довольно легко сделанный с остротой 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)) 
2
ответ дан 26 October 2013 в 01:45

Другие вопросы по тегам:

Похожие вопросы: