Copia solo cartelle e non file?


16

C'è un modo per copiare un'intera directory, ma solo le cartelle? Ho un file corrotto da qualche parte nella mia directory che sta causando il fallimento dei miei dischi rigidi.

Quindi, invece di copiare il file corrotto su un altro disco rigido, volevo solo copiare le cartelle, perché ho script che cercano centinaia di cartelle e non voglio crearle manualmente.

Ho cercato nel manuale di cp, ma non ho visto nulla (potrei averlo perso)

Supponiamo di avere questa struttura sul mio HDD guasto:

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

Tutto quello che desidero è la struttura delle directory, non nessun file.

Quindi finirei con il nuovo HDD:

dir1
    dir2
        dir4
dir3

Sperando che qualcuno conosca alcuni trucchi!


Vuoi dire che vuoi semplicemente copiare la struttura di directory o intendi semplicemente escludere i file nella directory di lavoro corrente (e tutti gli altri file nelle sottodirectory più profonde sono giochi)?
Oli

Ho aggiunto un esempio. scusa per la confusione
Shannon,

1
FYI uso rsyncper copiare la struttura delle directory E conservare le autorizzazioni e gli attributi] ( stackoverflow.com/a/9242883/52074 ). L'uso di plain mkdir -p non conserva autorizzazioni e attributi .
Trevor Boyd Smith,

Risposte:


15

Se si desidera eseguire il mirroring di uno scheletro di directory e non copiare file:

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

Cosa sta succedendo qui:

  • Trova sta solo selezionando le directory
  • Stiamo usando -links 2per trovare le directory più profonde possibili .
  • mkdir -p farà tutte le directory mancanti lungo la strada.

L'ho fatto in questo modo piuttosto che find -type d -exec mkdir -p "/path/to/backup/{}" \;perché si interromperà su un intero carico di mkdirchiamate. Possiamo dimostrarlo rapidamente con un piccolo test. Ecco l'albero di prova seguito da quello che ho eseguito per confrontare i due comandi:

$ 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 

E questo andrà solo meglio in una soluzione di parole reali con migliaia di directory.


Sono io un noob, ma come stai cercando la vecchia directory da copiare nel backup? Vedo solo un percorso qui
Shannon,

Se non si specifica un percorso, findutilizza la directory di lavoro corrente come punto di partenza. Se si desidera utilizzare un altro percorso, utilizzare la sintassi:find /path/to/search/ -type.....
Oli

Quindi ho impostato la mia directory su una determinata cartella che contiene lo scheletro che voglio copiare, eseguire find -type d -exec mkdir -p "/media/jinglez/TVSeries/TV Series"/{}" \;e tutto dovrebbe andare bene? Sembra che ci voglia un po 'di tempo: /
Shannon,

Eseguo questo dal normale terminale giusto?
Shannon,

1
Sono entrambi specifici per trovare la clausola exec. {} indica l'attuale nome file "trovato" e \; è solo la via d'uscita per porre fine alla clausola. A quanto pare, c'è un extra "nel tuo codice fino a non va bene, sono sicuro ... Dovresti leggere:find -type d -links 2 -exec mkdir -p "/media/jinglez/TVSeries/TV Series/{}" \;
Oli

2

Abbastanza facile da fare con una fodera in pitone:

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

Come script questo potrebbe essere riscritto in questo modo:

#!/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)) 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.