Ich versuche, entweder XARGS oder FOR in einer einzigen Zeile zu verwenden, um eine Liste vonURLsals Argumente schlägt dies fehl, da ein Dateiname keine URL sein kann. Wir haben versucht, dies mit FOR und XARGS zu tun, aber es schlägt fehl:
$for i in $(cat example.txt);do echo $i > $i; done
bash: http://example.site.com: No such file or directory
bash: https://secureexample.com: No such file or directory
$cat example.txt | xargs -I {} sh -c "echo {} > {}"
sh: 1: cannot create http://example.site.com: Directory nonexistent
sh: 1: cannot create https://secureexample.com: Directory nonexistent
ist es möglich, die Schrägstriche aus dem Argument beim zweiten Vorkommen (Name der Ausgabedatei) zu entfernen, sodass ich für jeden Host eine eindeutige Datei erhalte, zum Beispiel:
http.example.site.com
https.secureexample.com
Meine Kenntnisse in einzeiliger Bash sind leider ziemlich begrenzt, das ist die Präferenz des Unternehmens. Ich habe versucht, geschweifte Klammern im Dateinamen zu verwenden und den Wert mit SED, AWK und sogar CUT zu ändern, aber wie gesagt, meine Kenntnisse sind zu begrenzt. Ich habe auch mehrere Argumente mit XARGS und FOR ausprobiert, aber auch das hat bei mir kläglich versagt.
Ich konnte das Problem umgehen, indem ich separate Dateien erstellte mitURIsanstattURLs, und ergänzen Sie dann http:// und https://, das bedeutet aber die doppelte Anzahl an Dateien und die doppelte Anzahl an Befehlen, Beispiel:
$cat http_example.txt
example.site.com
secureexample.com
$cat http_example.txt | xargs -I {} sh -c "echo http://{} > {}"
$ls -la
-rw-r--r-- 1 root root 24 Mar 22 08:06 example.site.com
-rw-r--r-- 1 root root 25 Mar 22 08:06 secureexample.com
Ist dabeliebigwie lässt sich das mit einem einzeiligen Bash-Befehl bewerkstelligen, während eine Datei mit URLs verwendet wird? Danke!
Antwort1
while read -r i;do echo "$i">"${i#http*://}";done<example.txt
Dadurch werden der führende http(s)://
Teil sowie die Erstellungs- example.site.com
und secureexample.com
Dateielemente entfernt.
Dies ${i#http*://}
ist eine Konstruktion, die aus $i
dem führenden Teil die Übereinstimmung entfernt http*://
( *
ist ein Platzhalter).
while read -r i;do echo "$i">"$(echo "$i"|sed 's|://|.|')";done<example.txt
Dieses erstellt Dateien http.example.site.com
und https.secureexample.com
.
Das sed
Ersetzen ://
der Eingabedateizeilen durch .
.