Gibt es eine Möglichkeit, die Größe einer Remote-Datei wie zu erhalten
http://api.twitter.com/1/statuses/public_timeline.json
im Shell-Skript?
Gibt es eine Möglichkeit, die Größe einer Remote-Datei wie zu erhalten
http://api.twitter.com/1/statuses/public_timeline.json
im Shell-Skript?
wget --spider
?
Antworten:
Sie können die Datei herunterladen und ihre Größe erhalten. Aber wir können es besser machen.
Verwenden Sie curl , um mit der Option nur den Antwortheader abzurufen-I
.
Suchen Sie im Antwortheader nach Content-Length:
der Größe der Datei in Byte.
$ URL="http://api.twitter.com/1/statuses/public_timeline.json"
$ curl -sI $URL | grep -i Content-Length
Content-Length: 134
Um die Größe zu ermitteln, verwenden Sie einen Filter, um den numerischen Teil aus der obigen Ausgabe zu extrahieren:
$ curl -sI $URL | grep -i Content-Length | awk '{print $2}'
134
tr -d '\r'
, um sie zu entfernen.
curl -sI $URL | grep -i content-length
Um Groß- und Kleinschreibung zu vermeiden, müssen Sie -i
in grep
curl -sI https://code.jquery.com/jquery-3.1.1.min.js | grep -i content-length
Zwei Vorbehalte zu den anderen Antworten:
Sie können dies auch ohne grep / awk oder Piping tun:
curl 'http://api.twitter.com/1/statuses/public_timeline.json' --location --silent --write-out 'size_download=%{size_download}\n' --output /dev/null
Und die gleiche Anfrage mit Komprimierung:
curl 'http://api.twitter.com/1/statuses/public_timeline.json' --location --silent -H 'Accept-Encoding: gzip,deflate' --write-out 'size_download=%{size_download}\n' --output /dev/null
-L
zum Befehl hinzufügen , um Weiterleitungen zu folgen (ich habe keine praktische Weiterleitungs-URL zum Testen). Und ja, es lädt die gesamte Datei herunter.
Content-Length
für eine HEAD
Anfrage, brauchen Sie nicht die ganze Datei zum Download bereit . -I
Fügen Sie einfach das obige Beispiel hinzu, um zu sehen, wie es Null zurückgibt (zumindest am 25.02.2019). Meine Lösung ist allgemeiner.
Ähnlich wie die Antwort von codaddict , jedoch ohne den Aufruf an grep
:
curl -sI http://api.twitter.com/1/statuses/public_timeline.json | awk '/Content-Length/ { print $2 }'
content-length
wodurch Ihr Befehl unterbrochen wird. Es gibt viele Möglichkeiten, Groß- und Kleinschreibung in awk zu ignorieren, aber dies ist die kugelsicherste: curl -sI http://api.twitter.com/1/statuses/public_timeline.json | awk '/[Cc]ontent-[Ll]ength/ { print $2 }'
... natürlich ist grep auch nett;)
Die vorhergehenden Antworten funktionieren nicht, wenn Umleitungen vorhanden sind. Wenn Sie beispielsweise die Größe der Debian-ISO-DVD wünschen, müssen Sie die Option --location verwenden. Andernfalls kann die gemeldete Größe die des 302 Moved Temporarily
Antwortkörpers und nicht die der realen Datei sein.
Angenommen, Sie haben die folgende URL:
$ url=http://cdimage.debian.org/debian-cd/8.1.0/amd64/iso-dvd/debian-8.1.0-amd64-DVD-1.iso
Mit Curl könnten Sie erhalten:
$ curl --head --location ${url}
HTTP/1.0 302 Moved Temporarily
...
Content-Type: text/html; charset=iso-8859-1
...
HTTP/1.0 200 OK
...
Content-Length: 3994091520
...
Content-Type: application/x-iso9660-image
...
Aus diesem Grund bevorzuge ich die Verwendung HEAD
eines Alias für den lwp-request
Befehl aus dem libwww-perl- Paket (auf Debian). Ein weiterer Vorteil hat, dass es die zusätzlichen Streifen \ r Zeichen, die nachfolgende Kettenverarbeitung erleichtert.
Um die Größe der Debian-ISO-DVD abzurufen, könnte man zum Beispiel Folgendes tun:
$ size=$(HEAD ${url})
$ size=${size##*Content-Length: }
$ size=${size%%[[:space:]]*}
Bitte beachte, dass:
Für andere Muscheln müssen Sie möglicherweise auf sed, awk, grep et al. Zurückgreifen.
Verwenden Sie cURL, um im stillen Modus zu laufen -s
.
Ziehen Sie nur die Header -I
(um zu vermeiden, dass die gesamte Datei heruntergeladen wird).
dann mache einen case unempfindlichen grep -i
und gib das zweite Argument mit awk zurück $2
.
Ausgabe wird zurückgegeben als bytes
curl -sI http://api.twitter.com/1/statuses/public_timeline.json | grep -i content-length | awk '{print $2}'
//output: 52
oder
curl -sI https://code.jquery.com/jquery-3.1.1.min.js | grep -i content-length | awk '{print $2}'
//output: 86709
oder
curl -sI http://download.thinkbroadband.com/1GB.zip | grep -i content-length | awk '{print $2}'
//output: 1073741824
Wenn Sie die Größe in Kilobyte anzeigen möchten, ändern Sie die awk in:
awk '{print $2/1024}'
oder Megabyte
awk '{print $2/1024/1024}'
Die akzeptierte Lösung hat bei mir nicht funktioniert. Dies ist:
curl -s https://code.jquery.com/jquery-3.1.1.min.js | wc -c
wc
.
Ich habe eine Shell-Funktion, die auf der Antwort von codaddict basiert und die Größe einer entfernten Datei in einem für Menschen lesbaren Format ergibt:
remote_file_size () {
printf "%q" "$*" |
xargs curl -sI |
grep Content-Length |
awk '{print $2}' |
tr -d '\040\011\012\015' |
gnumfmt --to=iec-i --suffix=B # the `g' prefix on `numfmt' is only for systems
# ^ # that lack the GNU coreutils by default, i.e.,
# | # non-Linux systems
# |
# | # in other words, if you're on Linux, remove this
# | # letter `g'; if you're on BSD or Mac, install the GNU coreutils
} # | |
# +----------------------------------------+
All das für mich zu kombinieren funktioniert:
URL="http://cdimage.debian.org/debian-cd/current/i386/iso-dvd/debian-9.5.0-i386-DVD-1.iso"
curl --head --silent --location "$URL" | grep -i "content-length:" | tr -d " \t" | cut -d ':' -f 2
Dies gibt nur die Inhaltslänge in Bytes zurück:
3767500800
Ich benutze dies ([Cc]ontent-[Ll]ength:)
, weil ich Server bekommen habe, die bei der Header-Antwort mehrere Content-Length-Zeichen geben
curl -sI "http://someserver.com/hls/125454.ts" | grep [Cc]ontent-[Ll]ength: | awk '{ print $2 }'
Accept-Ranges: bytes
Access-Control-Expose-Headers: Date, Server, Content-Type, Content-Length
Server: WowzaStreamingEngine/4.5.0
Cache-Control: no-cache
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD
Access-Control-Allow-Headers: Content-Type, User-Agent, If-Modified-Since, Cache-Control, Range
Date: Tue, 10 Jan 2017 01:56:08 GMT
Content-Type: video/MP2T
Content-Length: 666460
$ curl -O -w 'We downloaded %{size_download} bytes\n'
https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 7328k 100 7328k 0 0 244k 0 0:00:29 0:00:29 --:--:-- 365k
We downloaded 7504706 bytes
Für automatisierte Zwecke müssen Sie nur den Befehl zu Ihrer Skriptdatei hinzufügen.
andere Lösung:
ssh userName@IP ls -s PATH | grep FILENAME | awk '{print$1}'
gibt Ihnen die Größe in KB