Copia di sottocartelle specifiche con struttura di directory in una nuova cartella


8

Sto avendo una seguente struttura di directory:

                Main_Dir
                   |
  -----------------------------------
  Subdir1       Subdir2       Subdir3
     |             |             |
 ---------     ---------     ---------
 |   |   |     |   |   |     |   |   |            
fo1 fo2 f03   fo1 fo2 f03   fo1 fo2 f03

Voglio copiare tutte le sottodirectory ( Subdir1, Subdir2, Subdir3) in una nuova cartella. Ma voglio solo copiare fo1e fo2cartelle nella nuova posizione.

Non sono sicuro di come si possa fare.


Copia tutto, elimina fo3?
ChuckCottrill,

Risposte:


4

Se l'albero delle directory è più di un semplice ..../f03, puoi usare questo rsynccomando per copiare ogni fo1& fo2ed escludere ogni altra directory con il nome fo*.

$ rsync -avz --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

Quando ho a che fare con questi tipi di scenari di copia, ne faccio sempre uso rsynced è --dry-run& --verboseswitch in modo da poter vedere cosa farà senza realmente dover copiare i file.

$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

Esempio

Funzionamento a secco.

$ rsync -avz --dry-run --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.
sending incremental file list
./

Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/

sent 201 bytes  received 51 bytes  504.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Se vuoi vedere alcune delle rsynclogiche interne su ciò che viene incluso / escluso, usa lo --verboseswitch.

$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

sending incremental file list
[sender] showing directory Subdir1/fo2 because of pattern fo[12]/
[sender] showing directory Subdir1/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir1/fo3 because of pattern fo*/
[sender] showing directory Subdir2/fo2 because of pattern fo[12]/
[sender] showing directory Subdir2/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir2/fo3 because of pattern fo*/
[sender] showing directory Subdir3/fo2 because of pattern fo[12]/
[sender] showing directory Subdir3/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir3/fo3 because of pattern fo*/
delta-transmission disabled for local transfer or --whole-file
./
Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 201 bytes  received 51 bytes  504.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Se è necessario escludere altre forme di directory, è possibile aggiungere più esclusioni.


3

Utilizzare rsync:

rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination

0

Potresti provare qualcosa del genere:

find Main_Dir -maxdepth 1 -mindepth 1 -type d | while IFS= read -r subdir; do
   mkdir -p new_dir/"$(basename $subdir)" && 
   cp -r "$subdir"/{fo1,fo2} new_dir/"$(basename $subdir)"/; 
done

Il findcomando restituisce tutte le sottodirectory dirette di Main_Dir. basenamerestituirà il nome della sottodirectory trovata (ad es. basename Main_Dir/Subdir1restituisce Subdir1). Quindi si utilizza l' espansione del controvento della shell per evitare di digitare fo1e fo2più volte e copiarli nella new_dir/$(basename $subdir)directory appena creata .

Nel caso specifico in cui menzioni dove ci sono solo directory sotto Main_Dire dove non ci sono spazi o caratteri strani nei nomi, puoi semplificare quanto sopra per

cd Main_Dir; for subdir in *; do 
  mkdir -p ../new_dir/$subdir && cp -rv $subdir/{fo1,fo2} ../new_dir/$subdir; 
done

0

Se la struttura della directory è esattamente come nell'esempio (ovvero tutti i fofile si trovano sullo stesso livello):

mkdir -p New_Dir/{Subdir1,Subdir2,Subdir3}
for subdir in Subdir1 Subdir2 Subdir3;do
    cp -r Main_Dir/"$dir"/{fo1,fo2} New_Dir/"$dir"/
done
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.