rsync Ne supprime pas les guillemets simples autour de la matrice de ligne --filter list

Nous essayons de restaurer en toute sécurité les fichiers de machines hautement infectées. Windows XP et 2003, qui est venu à nous à la suite de l'acquisition. J'ai un besoin similaire pour automatiser le script qui fonctionnera sur les machines DRBL Avec téléchargement PXE pour rsync Avec notre serveur.

Le code suivant conduit à la conclusion en guillemets simples du paramètre total '--filter =' '' dans rsync. Notez que echo Supprime des guillemets simples, mais pas rsync. Qu'est-ce que je fais mal? La création de chaque paramètre de l'enregistrement dans la matrice?

Refuse due à l'emprisonnement en guillemets simples

:

'--filter='\''- "Default User/"'\''  --filter='\''- "Application Data/"'\'' '

Quand j'exécute la même commande, enlevez manuellement des guillemets simples, rsync fonctionne bien.

TRAVAIL

:

--filter='\''- "Default User/"'\''  --filter='\''- "Application Data/"'\'' 

Essayé sans et sans --protect-args.


#!/bin/sh -x

PROTECTARGS=--protect-args
EXCLUDE=( '- "Default User/"' '- "Application Data/"' )
echo EXCLUDE="${EXCLUDE[*]}"
FILTER=()
for X in "${EXCLUDE[@]}"; do
FILTER=( "${FILTER[@]}" "--filter='${X}' " );
done;
echo FILTER="${FILTER[*]}"

if [ "1" == "1" ]; then
rsync --dry-run -vv --stats \
--recursive \
"$PROTECTARGS" \
"${FILTER[*]}" \
'/hddOld/Documents and Settings' \
'/hddNew/'
fi;


PRODUCTION:


FILTER=--filter='- "Default User/"' --filter='- "Application Data/"'
+ '[' 1 == 1 ']'
+ rsync --dry-run -vv --stats --recursive --protect-args '--filter='\''- "Default User/"'\'' --filter='\''- "Application Data/"'\'' ' '/hddOld/Documents and Settings' /hddNew/
Unknown filter rule: `'- "Default User/"' --filter='- "Application Data/"' '
rsync error: syntax or usage error (code 1) at exclude.c(817) [client=3.0.6]



bash-4.1.2-14.el6.x86_64
rsync version 3.0.6 protocol version 30
rsync-3.0.6-9.el6.x86_64
CentOS 6.4 x64

TRAVAIL ... Non ce n'est pas:


FILTER+=( --filter=""${X}"" );

RESULTS IN:
'--filter=- "Default User/" --filter=- "Application Data/"'

rsync Il ne se plaint pas de cette règle de filtrage, mais ne filtre pas "les données d'application /».
Invité:

Catherine

Confirmation de:

Vous avez deux problèmes:

Tout d'abord, n'utilisez pas de citations dans

--filter

(surtout S.

--protect-args

dans lequel il dit que l'utiliser pour éviter la nécessité de boucler des espaces, bien que mes tests montrent que des devis doubles sont également acceptés littéralement sans eux.). Le filtre devrait être

- Application Data/

. Comme vous l'avez écrit entre guillemets, il recherche un fichier nommé

"

Dans le dossier nommé

"Application Data

Un autre problème est que vous voulez que chaque filtre soit un argument séparé pour

rsync

, Alors utilisez

@

au lieu de

*

dans une équipe:

rsync --dry-run -vv --stats \
--recursive \
"$PROTECTARGS" \
"${FILTER[@]}" \
'/hddOld/Documents and Settings' \
'/hddNew/'

Testé avec:


GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)


rsync version 3.0.7 protocol version 30

J'ai créé un tableau avec

arr=(a b "c d")

, puis utilisé

touch "${arr[@]}"

Créer des fichiers

a
b
c d

dans

dir1

.

rsync -r --filter='- c d' dir1/ dir2

copies

a

et

b

à

dir2

.

rsync -r --filter='- "c d"' dir1/ dir3

copie tous les fichiers comme rsync à la recherche d'un fichier nommé

"c d"

Avec des citations dans le nom du fichier. Également testé en utilisant

mkdir

et

- c d/

et

- "c d/"

Pour vous assurer que les filtres de répertoire ne fonctionnent pas autrement, et

"c d/"

n'a pas exclu le catalogue tout en

c d/

L'exclu.

Blanche

Confirmation de:

J'ai fait travailler comme suit:

J'ai changé:

EXCLUDE=( '- "Default User/"' '- "Application Data/"' )

à

EXCLUDE=( '-_Default User/' '-_Application Data/' )

Il a supprimé des citations doubles et utilisée une syntaxe de soulignement alternative «_» après «-». La réponse précédente a suggéré cela, mais je devais ajouter la syntaxe «_», Afin qu'il a travaillé pour moi.

Aussi changé:

FILTER=( "${FILTER[@]}" "--filter='${X}' " );

à

FILTER=( "${FILTER[@]}" "--filter=${X}" );

Il a supprimé les apostrophes autour du remplacement de la variable X.

Et changé:

"${FILTER[*]}"

à

"${FILTER[@]}"

Cela conduit au fait que chaque élément de la matrice est traité comme paramètre distinct, et non comme l'ensemble de la matrice, comme indiqué précédemment.

Pour répondre aux questions, connectez-vous ou registre