Obtenez l'heure de modification du fichier distant via HTTP dans le script Bash

13

Je crée un simple script Bash pour extraire l'heure / la date de modification du fichier d'un fichier distant via HTTP.

Exemple de fichier: http://example.com/bar/example.pdf

Peut-on le faire sans télécharger le fichier réel? Sinon, quelle est la meilleure alternative?

Amal Murali
la source

Réponses:

13

Pour être honnête, pas directement.

Vous devrez récupérer les données du site distant pour obtenir des informations sur le fichier. Habituellement, cela se fait avec une HEADdemande, mais certains serveurs (la plupart?) Ne l'ont pas implémenté correctement et livrent le fichier entier, tout comme faire une GETdemande. En supposant que vous avez curlinstallé:

curl -s -v -X HEAD http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'

pourrait vous donner ce que vous voulez, mais comme dit, cela dépend fortement du serveur.

Karsten S.
la source
6
"Plus"? Je serais surpris si une des serveurs HTTP populaires dans le protocole violé manière telle.
user1686
Cela aurait dû changer bien sûr. Il y a quelque temps, lorsque j'ai traité de tels problèmes, c'était comme ça. Mais le temps passe. Si vous trouvez des sites qui exécutent encore cgi quelles que soient les "applications", ils ne sont probablement pas gérés HEAD. Néanmoins, ces sites vous donneront également le résultat, car ils sont censés tout livrer.
Karsten S.
3
Je suggère d'utiliser l' --headoption au lieu de -X HEADson plus concis pour que la commande devienne: curl -s -v --head http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'
Gautham C.
1
curl -svX HEADest encore plus concis ...
Karsten S.
1
@ Hi-Angel Non, il n'y en a généralement pas. Wget utilise l'en-tête If-Modified-Since pour dire "hey n'envoyez ce fichier que s'il est plus récent que cette date", c'est alors au serveur de l'implémenter et de le respecter. Si le serveur pense que le fichier n'a pas changé, il envoie une réponse 304 NON MODIFIÉE.
antonagestam
12

La réponse du serveur a généralement un Last-Modifiedchamp, vous pouvez le vérifier sans télécharger le fichier. Pas besoin d'utiliser -X HEAD, il y a une option spéciale -Ipour cela (la -ssortie de progression supprime) :

curl -sI http://example.com/bar/example.pdf | grep -i Last-Modified

De plus, dans mon cas, il n'y a pas de boucle installée (je fais un script pour un périphérique intégré) , juste wget. Le chemin avec wget est:

wget --server-response --spider http://example.com/bar/example.pdf 2>&1 | grep -i Last-Modified

L' --server-responseimpression des en-têtes et l' --spideroption force à ne pas télécharger les pages, mais à vérifier plutôt leur existence.

Salut ange
la source
2
C'est curlune meilleure réponse que celle acceptée. Peut-être en utilisant grep -idepuis souvent la "dernière modification" a un cas différent.
not2qubit
@ not2qubit thx pour la note, édité.
Hi-Angel