Voglio copiare tutti i file in una directory tranne alcuni file in una sottodirectory specifica. Ho notato che il comando 'cp' non aveva un'opzione --exclude. Quindi, come posso raggiungere questo obiettivo?
tar -c | tar -x
?
Voglio copiare tutti i file in una directory tranne alcuni file in una sottodirectory specifica. Ho notato che il comando 'cp' non aveva un'opzione --exclude. Quindi, come posso raggiungere questo obiettivo?
tar -c | tar -x
?
Risposte:
rsync è semplice e veloce:
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
Puoi usare --exclude
multipli volte.
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
Si noti che la directory thefoldertoexclude
dopo --exclude
opzione è relativo al sourcefolder
, cioè sourcefolder/thefoldertoexclude
.
Inoltre puoi aggiungere -n
per la corsa a secco per vedere cosa verrà copiato prima di eseguire un'operazione reale e, se tutto è a posto, rimuovilo -n
dalla riga di comando.
--exclude
thefoldertoexclude
relativo al sourcefolder
dir corrente di lavoro o? grazie
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder
userei - comunque upvote per rsync invece che find, in quanto puoi facilmente usare percorsi assoluti per il sorgente mentre nella ricerca è più complicato come usa {}
nel dst.
$ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/
o dal locale al remoto$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
Bene, se l'esclusione di determinati schemi di nomi di file dovesse essere eseguita da ogni utilità di file unix-ish (come cp, mv, rm, tar, rsync, scp, ...), si verificherebbe un'immensa duplicazione degli sforzi. Invece, tali cose possono essere fatte come parte del globbing , cioè dal tuo guscio.
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 !()
e questo annulla la partita. Lo schema può essere arbitrariamente complesso, a partire dall'enumerazione di percorsi individuali (come Vanwaril mostra in un'altra risposta): !(filename1|path2|etc3)
a cose simili a regex con stelle e classi di personaggi. Fare riferimento alla pagina man per i dettagli.
man 1 zshexpn
, / generazione del nome file .
Puoi fare setopt KSH_GLOB
e usare schemi tipo bash. O,
% 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 modello y
. Ancora una volta, per i dettagli completi consultare la manpage.
Il pesce shell ha una risposta più bella molto a questo:
🐟 cp (string match -v '* .excluded.names' - srcdir / *) destdir
Digita cp *
, premi CtrlX*e guarda cosa succede. non è dannoso lo prometto
zsh
però.
setopt -u extglob
.
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 di quella di origine.
-path
dell'argomento per testare le gerarchie dei percorsi, non -iname
find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
rsync
? Perché potrebbe non essere presente nel sistema! mentre find
, cp
è sempre al loro posto. O da tipi di ragazzi, che hai installato 2 GB di cose per fare cose semplici?
cp -r `ls -A | grep -v "c"` $HOME/
# $1 = source path # $2 = destination path # $3 = filter copy_from_source_to_destination_except_filter() { cp -r $(ls -A $1 | grep -v -w $3 | awk -v path=$1 '{printf "%s/%s ", path, $1}') $2 }
Il modo più semplice che ho trovato, in cui è possibile copiare tutti i file escludendo file e cartelle semplicemente aggiungendo i loro nomi tra parentesi:
shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/
-bash: !: event not found
Espandendo il commento di mvds , questo funziona per me
cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2
È relativo alla directory di origine.
Ciò escluderà la directory source/.git
dalla copia.
rsync -r --exclude '.git' source target
rsync
rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/
e prima provalo con l'opzione -n per vedere cosa verrà copiato
Presumo che tu stia usando bash o dash. Funzionerebbe?
shopt -s extglob # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination
Eseguendo una ls escludendo i file non desiderati e utilizzandola come primo argomento per cp
ls
e semplicemente farlo cp !(file1|file1) dest
.
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsync
è in realtà abbastanza complicato. devi fare più test per farlo funzionare.
Diciamo che si desidera copiare /var/www/html
a /var/www/dev
ma necessità di escludere le /var/www/html/site/video/
directory forse per le sue dimensioni. Il comando sarebbe:
rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev
Alcuni avvertimenti :
/
nella fonte, altrimenti copierà anche la directory di origine anziché il suo contenuto e diventerà /var/www/dev/html/xxxx
, che forse non è quello che vuoi.Il --exclude
percorso è direttamente relativo alla fonte. Anche se inserisci il percorso assoluto completo, non funzionerà.
-v
è per prolisso, -a
è per la modalità archivio, il che significa che vuoi ricorsione e vuoi preservare quasi tutto.
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
Modifica: dimenticato di escludere anche il percorso target (altrimenti verrebbe copiato in modo ricorsivo).
Questa è una modifica della risposta di Linus Kleen. La sua risposta non ha funzionato per me perché ci sarebbe un. aggiunto davanti al percorso del file che cp non piace (il percorso sembrerebbe source / .destination / file).
Questo comando ha funzionato per me:
find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;
il comando --parents conserva la struttura della directory.
mv tobecopied/tobeexcluded .
cp -r tobecopied dest/
mv tobeexcluded tobecopied/
Basta spostarlo temporaneamente in una directory nascosta (e rinominarlo dopo, se lo si desidera).
mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
cp
una shell POSIX standard come sh
.
Uso un ciclo "do while" per leggere l'output del comando find. In questo esempio, sto abbinando (piuttosto che escludendo) determinati modelli poiché esiste un numero più limitato di corrispondenze di motivi che desidero di quello che non desidero. È possibile invertire la logica con un -not davanti ai flag -iname:
find . -type f -iname "*.flac" -o -print0 -iname "*.mp3" -print0 -o -iname "*.wav" -print0 -o -iname "*.aac" -print0 -o -iname "*.wma" -print0 | while read -d $'\0' file; do cp -ruv "$file" "/media/wd/network_sync/music/$file"; done
Uso quanto sopra per copiare tutti i file di tipo musicale più recenti sul mio server rispetto ai file su un Live Hub TV digitale occidentale che ho montato su / media / wd. Uso quanto sopra perché ho molti file DVD, mpeg, ecc. Che voglio escludere E perché per qualche ragione rsync sembra che stia copiando, ma dopo aver guardato il dispositivo wd, i file non sono lì nonostante errori durante il rsync con questo comando:
rsync -av --progress --exclude=*.VOB --exclude=*.avi --exclude=*.mkv --exclude=*.ts --exclude=*.mpg --exclude=*.iso --exclude=*ar --exclude=*.vob --exclude=*.BUP --exclude=*.cdi --exclude=*.ISO --exclude=*.shn --exclude=*.MPG --exclude=*.AVI --exclude=*.DAT --exclude=*.img --exclude=*.nrg --exclude=*.cdr --exclude=*.bin --exclude=*.MOV --exclude=*.goutputs* --exclude=*.flv --exclude=*.mov --exclude=*.m2ts --exclude=*.cdg --exclude=*.IFO --exclude=*.asf --exclude=*.ite /media/2TB\ Data/data/music/* /media/wd/network_sync/music/
ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir
La prima parte di ls
tutti i file, ma nascosti file specifici con flag -I
. L'output di ls
viene utilizzato come input standard per la seconda parte. xargs
compila ed esegui il comando cp -rf -t destdir
dall'input standard. il flag -r
significa -f
ricorrere in modo ricorsivo alle directory, significa forzare la copia dei file che sovrascriveranno i file in destdir
, -t
specificare la copia della directory di destinazione in.
cp -r ls -A | grep -v "Excluded_File_or_folder"
../$target_location -v