Comment télécharger le dernier fichier dans un dossier en utilisant un scp?

10

Je voudrais exécuter un transfert scp pour télécharger le dernier (le plus récent) fichier dans un certain répertoire vers mon répertoire local.

Quelque chose comme ça:

Lors de l'obtention du fichier le plus récent uniquement, pas tous, dans backups.

Richard Rodriguez
la source

Réponses:

12

Supposons que vous ayez des variables serveret dirdéfinies, vous pouvez le faire

$ dir="~"
$ server="[email protected]"
$ scp $server:$dir/$(ssh $server 'ls -t $dir | head -1') .

Où vous recherchez d'abord le fichier le plus récent, puis copiez-le.

Remarque: je ne l'ai pas vérifié à toute épreuve (par exemple, la dernière entrée étant un dossier)

Bernhard
la source
Si c'est un répertoire qui ne scpera rien. Vous devez utiliser scp -r.
slm
@slm Correct, mais il ne voudra peut-être pas copier cela.
Bernhard
Si le scpget est interrompu, il devra recommencer la copie depuis le début, rsyncpeut reprendre là où il s'était arrêté.
slm
Pour bash, je devais remplacer les guillemets simples par des guillemets doubles dans l'argument to ssh.
Johannes Bittner
1
Vous pouvez supprimer le premier $ dir en procédant comme suit (a ajouté un /*à la fin du deuxième $ dir):scp $server:$(ssh $server 'ls -t $dir/* | head -1') .
Jesse
1

scpest stupide dans le sens où il copie simplement à l'aveugle des fichiers de la source vers la destination. Si vous voulez quelque chose de plus intelligent sur la copie de fichiers, vous devrez utiliser un outil tel que rsync.

$ rsync -avz root@rimmer.sk:'$(find /home/rimmer/backups/ -ctime -1)' /home/rimmer/backups/

Cela ne copiera que les fichiers manquants ou qui ont changé du répertoire des sauvegardes de rimmer.sk au cours du dernier jour (-ctime -1) vers le répertoire de votre sauvegarde locale.

-ctime n
   File's  status  was last changed n*24 hours ago.  See the comments for 
   -atime to understand how rounding affects the interpretation of file 
   status change times.

Références

slm
la source
Le problème avec rsync est le même. Si je suis hors ligne depuis 2 jours, il essaie de copier toutes les sauvegardes de tous les jours, ce dont je n'ai pas besoin du tout et c'est énorme.
Richard Rodriguez
@RichardRodriguez - OK, veuillez mettre à jour votre question et préciser ce que vous recherchez.
slm
2
@slm: Je pense que la question est bien telle qu'elle est. Je veux juste télécharger le dernier fichier dans un répertoire. Que puis-je expliquer de plus à ce sujet? :)
Richard Rodriguez
@RichardRodriguez - quels fichiers se trouvent dans ce répertoire? Un exemple de liste serait utile.
slm
1
Pourquoi le vote négatif?
slm
0

Un peu tard pour la fête mais peut-être qu'une solution avec ssh et rsync fonctionnera pour certains:

source_host="yourhost.com"
source_dir="/a/dir/on/yourhost.com/"
target_dir="/the/dir/where/last_backup/will/be/placed"
last_backup=$(ssh user@${source_host} "ls -t ${source_dir} | head -1")
if [ "${last_backup}" == "" ]; then
    echo "ERROR: didn't find a backup, cannot continue!"
else
    echo "the last backup is: ${last_backup}"
    rsync -avzh user@${source_host}:${source_dir}/${last_backup} ${target_dir}
fi
DRAD
la source