Rsync et rename du fichier à la volée

Bonjour,

Je dois récupérer un fichier située sur un serveur distant, je ne connais pas le nom de ce fichier (le nom est aléatoire), je sais juste qu’il contient la date de la veille, il y a un seul fichier généré par jour (il s’appelle donc : $DATE). Je souhaiterais le récupérer en local et le renommer à la volée pour qu’il ait un nom formalisé.
DATE est ma variable qui me donne la date au bon format qui se trouve dans le nom du fichier.

J’ai fait un script dans lequel j’ai mis la ligne suivante, mais ça ne marche pas :

rsync -avz user@server-distant:/var/rep/$DATE /var/rep_stockage/ | rename -v ‘s/.*/"$DATE-server-distant.txt"/’

Pourriez-vous m’indiquer comment faire svp ?

Merci d’avance pour votre aide,
Jini

Mais encore ? Un peu plus de précision n’aurait pas fait de mal… :wink:

Déjà est-ce que le rsync seul fonctionne correctement ? D’ailleurs à ce propos s’il s’agit juste de copier un seul fichier un scp serait peut-être plus approprié, mais là n’est pas la question.

Ensuite, le pipe | est fait pour transmettre la sortie d’un programme à l’entrée d’un autre programme donc pas étonnant que ça ne marche pas (la commande située après le pipe s’exécute immédiatement sans attendre que la commande située avant le pipe ait fini).
Il te faudrait plutôt deux commandes à la suite :

rsync -avz user@server-distant:/var/rep/*$DATE* /var/rep_stockage/ mv -n /var/rep_stockage/*$DATE* /var/rep_stockage/$DATE-server-distant.txt
Si tu tiens absolument à ce que tout se fasse en une seule ligne, utilise && pour lier les deux ce qui garantira que mv ne s’exécutera que si rsync s’est déroulé correctement :

Mais encore ? Un peu plus de précision n’aurait pas fait de mal… :wink:

Déjà est-ce que le rsync seul fonctionne correctement ? D’ailleurs à ce propos s’il s’agit juste de copier un seul fichier un scp serait peut-être plus approprié, mais là n’est pas la question.[/quote]
Même pour plusieurs (voir l’option -r).

[quote=“syam”]Ensuite, le pipe | est fait pour transmettre la sortie d’un programme à l’entrée d’un autre programme donc pas étonnant que ça ne marche pas (la commande située après le pipe s’exécute immédiatement sans attendre que la commande située avant le pipe ait fini).
Il te faudrait plutôt deux commandes à la suite :

rsync -avz user@server-distant:/var/rep/*$DATE* /var/rep_stockage/ mv -n /var/rep_stockage/*$DATE* /var/rep_stockage/$DATE-server-distant.txt
Si tu tiens absolument à ce que tout se fasse en une seule ligne, utilise && pour lier les deux ce qui garantira que mv ne s’exécutera que si rsync s’est déroulé correctement :

Oui et là ça peut poser un problème car il n’y a pas d’erreur au premier abord. Ce qui se passe c’est que le dossier a envoyé est renomé pendant son envoie. Selon comment travail rsync ça va le faire arrêter net.

Par contre la commande :

est fausse à mon humble avis. Le “/var/rep/$DATE” doit être étendu par le shell distant et la le shell local, il me semble qu’un simple scp fonctionnerais de manière plus simple. Sans test je pense qu’il faudrait protéger les *.

Merci beaucoup pour vos réponses…je n’avais pas pensé à un simple mv ! C’est ce que je vais utiliser du coup…

Pour info, le rsync tout seul fonctionne très bien.

Je clôture le sujet…à moins que quelqu’un trouve la commande miracle pour le faire en une seule commande et à la volée :laughing:

Exact j’avais pas percuté (pourtant j’ai fait exactement la même remarque y’a pas longtemps dans un autre fil à propos de find :blush: comme quoi c’est assez vicieux cette histoire d’expansion shell).

En tous cas avec scp les choses seraient nettement plus simples puisqu’on pourrait directement renommer le fichier pendant la copie :

Note : je suis pas certain de la syntaxe pour protéger les * contre l’expansion shell. Je sais que si on mettait des apostrophes autour du nom complet ‘/var/rep/$DATE ça ne marcherait pas car du coup $DATE ne serait plus remplacé en local (et a priori le serveur ne connaît pas la variable $DATE). Et je crois me souvenir que les guillemets “/var/rep/$DATE autorisent l’expansion locale des * contrairement aux apostrophes (edit : je me trompais).
Je pense que ce la manière dont je l’ai écrit /var/rep/’’$DATE’ fonctionne comme on est en droit de l’attendre.

Edit : suite au post de MisterFreez ci-dessous, la commande serait mieux comme ça :

Sujet clôturé = coche verte :wink:

Et bien, la voilà ma commande miracle !!! :041

scp en protégeant les * avec des quotes… J’avais déjà testé mais sans les ’ '.

Là ça marche nickel !

Mille merci,

Bonne fin d’après-midi !

jini

$ ls "*" ls: impossible d'accéder à *: Aucun fichier ou dossier de ce type
:wink:

Oui mais c’est la plus lourde. Il y avait ça d’un peu plus léger :

Mais, la première solution (celle avec les ") est la meilleure (rien ne nous dis qu’il n’y a pas d’espace dans $DATE). Je vais même plus loin et je prends l’habitude depuis quelque temps d’écrire (presque) toujours ainsi :

Les avantages sont multiples :
[ul]
[li]la coloration syntaxique des éditeurs est top (on vois que c’est une chaine complète et la variable en pleins milieu)[/li]
[li]on protège des expansions multiples[/li]
[li]d’une manière générale j’aime bien délimiter les variables :slightly_smiling: [/li][/ul]

Je te laisse cliquer sur la coche verte.

[quote=“MisterFreez”]$ ls "*" ls: impossible d'accéder à *: Aucun fichier ou dossier de ce type
:wink:[/quote]
Ok je retiens (au moins jusqu’à ce que j’oublie… :mrgreen:).

[quote=“MisterFreez”]Il y avait ça d’un peu plus léger :

/var/rep/\*$DATE\*

C’est vrai que je pense jamais à l’échappement par \ sauf quand il s’agit d’une espace. :blush:

[quote=“MisterFreez”]Mais, la première solution (celle avec les ") est la meilleure (rien ne nous dis qu’il n’y a pas d’espace dans $DATE). Je vais même plus loin et je prends l’habitude depuis quelque temps d’écrire (presque) toujours ainsi :

"/var/rep/*${DATE}*"

Les avantages sont multiples :
[ul]
[li]la coloration syntaxique des éditeurs est top (on vois que c’est une chaine complète et la variable en pleins milieu)[/li]
[li]on protège des expansions multiples[/li]
[li]d’une manière générale j’aime bien délimiter les variables :slightly_smiling: [/li][/ul][/quote]
T’as entièrement raison, c’est ce que j’essaye de faire aussi. En général je pense bien à mettre des guillemets autour, par contre les variables ${…} j’ai encore du mal à le faire systématiquement.