Quand je cours svn st | awk '{print $2}'
, je reçois:
a.py
b.py
c.py
Ensuite, je veux scp
ces fichiers sur un serveur distant. J'ai essayé:
svn st | awk '{print $2}' | xargs scp my_name@my_server:~/
Mais ça ne marche pas. Quelle est la bonne commande pour ce faire?
Je vous remercie!
svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/
xargs
-Iz
pas le cas-iz
-iz
sur Solaris, et cela fonctionne toujours. Merci pour le pointeur.-I
. La page de manuel AIX (6.1) indique qu'elle-i
est obsolète et-I
doit être utilisée. Solaris 10 (et 9) possède les deux-i
et-I
.-i
depuis Solaris 2.5. vieillir est une triste affaire, mes amis. :)La raison pour laquelle cela ne fonctionne pas est que vous dites
xargs
de courirL'ordre des arguments ne correspond pas à ce que vous voulez faire. Une solution consiste à forcer les noms de fichiers à apparaître avant la destination sur la ligne de commande. Cela nécessite des xargs GNU (c'est-à-dire Linux ou Cygwin). Pendant que nous y sommes, nous pouvons passer
-d '\n'
pour nous assurer que tout nom de fichier qui ne contient pas de sauts de ligne fonctionnera (sans-d
, xargs attend une citation étrange de son entrée); cela n'est pas nécessaire si vous travaillez avec des arborescences de sources logicielles typiques, dans lesquelles les noms de fichiers ont tendance à être très apprivoisés.Un inconvénient de cette méthode est qu'elle
scp
est appelée séparément pour chaque fichier. Si vous copiez beaucoup de petits fichiers, cela peut faire une différence significative, car une connexion SSH prend un peu de temps à établir. Vous pouvez considérablement raccourcir le temps par connexion en utilisant une connexion maître SSH (cela dépasse la portée de cette réponse, voir le manuel, en particulier les optionsControlMaster
et ).ControlPath
.ssh/config
Un moyen de forcer les arguments à être au bon endroit est de passer par un shell intermédiaire. Il s'agit d'une technique générale pour réorganiser les arguments lors de l'utilisation de
xargs
oufind … -exec
.Une autre possibilité consiste à utiliser à la
rsync
place descp
. Vous pouvez transmettrersync
une liste de noms de fichiers sur une entrée standard. Étant donné qu'ilrsync
attend une liste de modèles et non une liste de noms de fichiers, cela nécessite que vos noms de fichiers ne contiennent aucun caractère générique (en particulier, pas de retour à la ligne, pas\[*?
et pas d'initiale#
ou;
).la source