Yalnızca klasör değil dosya kopyalansın mı?


16

Bir dizinin tamamını değil, yalnızca klasörleri kopyalamanın bir yolu var mı? Sabit disklerimin bozulmasına neden olan dizinimde bir yerde bozuk bir dosya var.

Bozuk dosyayı başka bir sabit diske kopyalamak yerine, sadece klasörleri kopyalamak istedim, çünkü yüzlerce klasörü arayan komut dosyalarım var ve hepsini elle oluşturmak istemiyorum.

CP kılavuzunu aradım, ancak hiçbir şey göremedim (kaçırmış olabilirim)

Diyelim ki benim başarısız HDD'imde bu yapı var:

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

Tek istediğim dizin yapısı, herhangi bir dosya değil.

Bu yüzden yeni HDD ile bitirdim:

dir1
    dir2
        dir4
dir3

Birisinin bazı hileler bilmesi umuduyla!


Sadece dizin yapısını kopyalamak mı istiyorsun yoksa sadece mevcut çalışma dizinindeki dosyaları (ve daha derin alt dizinlerdeki diğer tüm dosyalar oyun) hariç tutmak mı istiyorsun?
Oli

Bir örnek ekledim. kafa karıştırıcı olduğum için üzgünüm
Shannon

1
FY: rsyncDizin yapısını kopyalamak ve izinleri ve öznitelikleri korumak için kullanılır] ( stackoverflow.com/a/9242883/52074 ). Plain kullanmak mkdir -p izinleri ve nitelikleri korumaz .
Trevor Boyd Smith

Yanıtlar:


15

Bir dizin iskeletini yansıtmak ve dosya kopyalamak istemiyorsanız:

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

Burada neler oluyor:

  • Bul, yalnızca dizinleri seçmektir
  • Mümkün-links 2 olan en derin dizinleri bulmak için kullanıyoruz .
  • mkdir -p yol boyunca eksik dizinler oluşturacaktır.

find -type d -exec mkdir -p "/path/to/backup/{}" \;Bir sürü aramada keseceği için bunu böyle yaptım mkdir. Bunu küçük bir testle çabucak kanıtlayabiliriz. İşte test ağacı ve ardından iki komutu karşılaştırmak için koştuğum şey:

$ 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 

Ve bu sadece binlerce dizin içeren gerçek bir çözümde daha iyi olacak.


Bu bir çaylak olmak, ancak eski direk yedekleme kopyalamak için nasıl arama? Burada sadece bir yol görebiliyorum
Shannon

Bir yol belirtmezseniz find, geçerli çalışma dizinini başlangıç ​​noktası olarak kullanır. Başka bir yol kullanmak istiyorsanız sözdizimini kullanın:find /path/to/search/ -type.....
Oli

Bu yüzden dizinimi kopyalamak, çalıştırmak istediğim iskeleti içeren belirli bir klasöre ayarladım find -type d -exec mkdir -p "/media/jinglez/TVSeries/TV Series"/{}" \;ve her şey yolunda mı? Biraz zaman alıyor gibi görünüyor: /
Shannon

Bunu normal terminalden çalıştırıyorum değil mi?
Shannon

1
Her ikisi de find'ın yürütme maddesine özeldir. {} geçerli "bulunan" dosya adını ve \; sadece cümleyi bitirmek için kaçış. Görünüşe göre, ekstra bir "kadar iyi bir kod var, eminim ... Okumalısınız:find -type d -links 2 -exec mkdir -p "/media/jinglez/TVSeries/TV Series/{}" \;
Oli

2

Python tek astar ile oldukça kolay:

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

Komut dosyası olarak bu şekilde yeniden yazılabilir:

#!/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)) 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.