Копіювати лише папки, а не файли?


16

Чи є спосіб скопіювати весь каталог, але лише папки? У мене в каталозі десь пошкоджений файл, який спричиняє збій моїх жорстких дисків.

Отже, замість копіювання пошкодженого файлу на інший жорсткий диск, я хотів просто скопіювати папки, тому що у мене є сценарії, які шукають сотні папок, і мені не хочеться вручну створювати їх усі.

Я шукав керівництво cp, але нічого не бачив (можливо, його пропустили)

Скажіть, у мене така структура на моєму невдалому жорсткому диску:

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

Все, що я хочу, - це структура каталогу, а не файли взагалі.

Тож я б закінчився новим жорстким диском:

dir1
    dir2
        dir4
dir3

Сподіваючись, що хтось знає якісь хитрощі!


Ви маєте на увазі, що хочете просто скопіювати структуру каталогів чи ви просто маєте на увазі, що хочете виключити файли в поточному робочому каталозі (а всі інші файли в більш глибоких підкаталогах - це гра)?
Олі

Я додав приклад. вибачте за те, що плутали
Шеннон

1
FYI використовує rsyncдля копіювання структури каталогу та збереження дозволів та атрибутів] ( stackoverflow.com/a/9242883/52074 ). Використання звичайного mkdir -p не зберігає дозволи та атрибути .
Тревор Бойд Сміт

Відповіді:


15

Якщо ви хочете віддзеркалити каркас каталогів та скопіювати файли:

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 

І це лише покращиться в реальному слові з тисячами каталогів.


Це я як ноб, однак як ви шукаєте старого редактора, щоб скопіювати його в резервну копію? Тут я бачу лише один шлях
Шеннон,

Якщо ви не вказали шлях, findвикористовуйте поточну робочу директорію як вихідну точку. Якщо ви хочете скористатися іншим шляхом, використовуйте синтаксис:find /path/to/search/ -type.....
Oli

Тому я встановив свій каталог у певну папку, яка містить скелет, який я хочу скопіювати, запустити, find -type d -exec mkdir -p "/media/jinglez/TVSeries/TV Series"/{}" \;і все повинно бути добре? Здається, пройде час: /
Шеннон

Я запускаю це з нормального терміналу, правда?
Шеннон

1
Вони обидва конкретні, щоб знайти виконувальне застереження. {} означає поточне "знайдене" ім'я файлу та \; це лише втеча, щоб закінчити пункт. По зовнішньому вигляду, у твоєму коді є додатково ", я впевнений ... Я повинен прочитати:find -type d -links 2 -exec mkdir -p "/media/jinglez/TVSeries/TV Series/{}" \;
Oli

2

Досить легко виконати однотонний пітон:

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)) 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.