Écrire la sortie de wget ou curl dans un nom de fichier personnalisé basé sur l'url

12

Par exemple, j'ai un lien http://www.abc.com/123/def/ghi/jkl.mno. Je veux le télécharger en utilisant wgetou curlet obtenir le nom du fichier de sortie comme def_ghi_jkl.mno, où la partie def_ghiest prise à partir du lien.

Je mettrai cette wgetcommande dans un script pour télécharger plusieurs fichiers afin qu'il ne puisse pas donner explicitement le nom du fichier de sortie.

gvz
la source

Réponses:

15

curla la -o, l' --output option qui prend un seul argument indiquant la sortie du nom de fichier doit être écrit à la place de stdout. Si vous utilisez {}ou []pour entourer des éléments dans l'URL (généralement utilisé pour récupérer plusieurs documents), vous pouvez utiliser #suivi d'un nombre dans le spécificateur de nom de fichier. Chacune de ces variables sera remplacée par la chaîne correspondante pour l'URL récupérée. Pour récupérer plusieurs fichiers, ajoutez une liste de jetons séparés par des virgules à l'intérieur du {}. Si des parties des URL à récupérer sont des nombres séquentiels, vous pouvez spécifier une plage avec [].

Exemples:

  curl http://www.abc.com/123/{def}/{ghi}/{jkl}.mno -o '#1_#2_#3.mno'

Notez les guillemets autour de l'argument option (non requis à moins que le nom de fichier ne commence par l'une des variables développées). Cela devrait aboutir au fichier de sortie def_ghi_jkl.mno.

  curl http://www.abc.com/123/{def}/{ghi}/{jkl,pqr,stu}.mno -o '#1_#2_#3.mno'

Cela devrait entraîner les fichiers de sortie def_ghi_jkl.mno, def_ghi_pqr.mnoet def_ghi_stu.mno.

 curl http://www.abc.com/123/{def}/{ghi}/[1-3].mno -o '#1_#2_#3.mno'

Cela devrait se traduire dans les fichiers de sortie def_ghi_1.mno, def_ghi_2.mno, def_ghi_3.mno.

Thomas Nyman
la source
2

wgetpossède un commutateur -O(forme longue --output-document) qui vous permet de spécifier le nom du fichier dans lequel enregistrer. (Curl a probablement quelque chose de similaire.) Vous pouvez donc faire:

wget -O def_ghi_jkl.mno http://www.abc.com/123/def/ghi/jkl.mno

et il fera ce que vous voulez.

Vous pourriez probablement créer un wrapper autour de wget si vous souhaitez automatiser ce schéma de dénomination, mais il serait assez difficile d'obtenir une protection contre les balles et est certainement hors de portée de cette réponse. (Le cas simple d'un seul fichier téléchargé à partir d'une URL explicite ne devrait pas être très difficile à obtenir correctement, mais ce n'est pas le seul mode de fonctionnement de wget. Pour nommer un seul cas qui rend cela légèrement non trivial, vous pouvez spécifier plusieurs URL sur la ligne de commande.)

Notez que ce -On'est pas du tout le même que celui -oqui écrit la propre sortie de wget dans le fichier nommé.

un CVn
la source
Cela fait partie d'un script, donner un nom de fichier explicite comme ça ne fonctionnera pas.
gvz
@ user47567 Pourquoi pas? Qu'en est-il du fait que wget ou curl est appelé à partir d'un script rend cela impossible? (Et vraiment, si vous avez de telles contraintes sur les réponses qui fonctionneront, ces informations devraient vraiment entrer dans la question depuis le début.)
un CVn le
0

Voici quelques astuces de substitution Bash

link="http://www.abc.com/123/def/ghi/jkl.mno"
OutputFile=$( echo ${link:23: 23}| tr "/" "_" )
echo $OutputFile
def_ghi_jkl.mno

{$link:23: 23}supprimera " http://www.abc.com/123/ " tel quel ${parameter:offset:length}, puis trremplacera /par _.

Alors maintenant, vous pouvez facilement l'utiliser avec wget ou curl

wget $link  -O $OutputFile

Nous pouvons également utiliser awk, cela extraira les trois derniers fichiers de la chaîne d'entrée:

OutputFile=$( echo $link | awk -F/ 'BEGIN{OFS="_"}{ print $( NF-2),$(NF - 1 ),$NF}' )
Rahul Patil
la source
0

Le nom de fichier dont vous avez besoin ne peut pas être dérivé par wgetlui-même, il doit donc être géré par un script shell:

$ url='http://www.example.com/123/def/ghi/jkl.mno'
$ outFile=$(echo "$url" | cut -d /  -f 5- | tr / _)
$ echo $outFile 
def_ghi_jkl.mno
$ wget "$url" -O "$outFile"

Ou si vous l'aimez en une seule ligne:

wget "$url" -O "$(echo "$url" | cut -d /  -f 5- | tr / _)"
Volker Siegel
la source
0

Si vous préférez le curl, le moyen le plus direct est:

curl -L -o <filename> "https://drive.google.com/uc?export=download&id=<file id>"

nom de fichier: le nom du fichier téléchargé

id fichier: l'identifiant du fichier dans la vue Web de Google Drive au format https://drive.google.com/file/d/ id fichier / vue

Haricot agile
la source