GNU/Linux >> Linux Esercitazione >  >> Linux

Come utilizzare il comando 'cp' per escludere una directory specifica?

Perché usare rsync quando puoi fare:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

Ciò presuppone che la struttura della directory di destinazione sia la stessa della sorgente.


cp -r `ls -A | grep -v "c"` $HOME/

Bene, se l'esclusione di determinati modelli di nomi di file dovesse essere eseguita da ogni utility di file unix-ish (come cp, mv, rm, tar, rsync, scp, ...), si verificherebbe un'immensa duplicazione dello sforzo. Invece, queste cose possono essere fatte come parte del globbing, cioè dalla tua shell.

bash

man 1 bash , / extglob .

Esempio:

$ shopt -s extglob
$ echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
$ echo images/!(*.jpg)
images/004.bmp images/2252.png

Quindi hai appena inserito uno schema all'interno di !() , e nega la corrispondenza. Lo schema può essere arbitrariamente complesso, a partire dall'enumerazione dei singoli percorsi (come mostra Vanwaril in un'altra risposta):!(filename1|path2|etc3) , a cose simili a espressioni regolari con stelle e classi di caratteri. Fare riferimento alla manpage per i dettagli.

zsh

man 1 zshexpn , / generazione del nome file .

Puoi fare setopt KSH_GLOB e usa modelli simili a bash. Oppure,

% setopt EXTENDED_GLOB
% echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
% echo images/*~*.jpg
images/004.bmp images/2252.png

Quindi x~y corrisponde al modello x , ma esclude il pattern y . Ancora una volta, per i dettagli completi fare riferimento a manpage.

pesce

Il guscio di pesce ha una risposta molto più carina a questo:

🐟 cp (string match -v '*.excluded.names' -- srcdir/*) destdir

Suggerimento bonus bonus

Digita cp * , premi Ctrl X * e guarda cosa succede.


rsync è facile e veloce:

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude

Puoi usare --exclude più volte.

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude

Notare che la directory thefoldertoexclude dopo --exclude l'opzione è relativa al sourcefolder , ovvero sourcefolder/thefoldertoexclude .

Inoltre puoi aggiungere -n per un test di prova per vedere cosa verrà copiato prima di eseguire l'operazione reale e, se tutto è a posto, rimuovi -n dalla riga di comando.


Linux
  1. Come usare il comando Su in Linux

  2. [Linux]:come escludere la directory quando si utilizza il comando shell "tar".

  3. Il comando Linux rsync:come usarlo

  4. Come pianificare un comando Rsync?

  5. Come usare il comando Rsync in Linux?

Come utilizzare il comando cd di Linux per cambiare directory

Come usare il comando cd in Linux

Come usare Rsync

Come escludere una directory durante la ricerca di file in Linux

Come usare il comando PS

Come usare il comando TOP