Wie übersetze ich den folgenden "for / f" -Befehl von cmd für einen entsprechenden Befehl in Linux centos 6,64?

440
Mike

Wie kann ich den folgenden CMD-Befehl in einen Befehl in Linux-Centos 6,64 übersetzen?

for /f "tokens=1*" %i in (links.txt) do wget -O "%j" "%i" 

PS: links.txt ist eine Datei mit zwei durch Tabulatoren getrennten Spalten, eine mit dem Link und die andere mit dem Namen, wie die Datei gespeichert werden soll.

Vielen Dank

2
Bitte beachten Sie, dass https://superuser.com kein kostenloser Skript- / Code-Schreibservice ist. Wenn Sie uns sagen, was Sie bisher versucht haben (einschließlich der Skripts / des Codes, die Sie bereits verwenden) und wo Sie stecken bleiben, können wir versuchen, bei bestimmten Problemen zu helfen. Sie sollten auch lesen [Wie kann ich eine gute Frage stellen?] (Https://superuser.com/help/how-to-ask). DavidPostill vor 6 Jahren 1
Hinweis: - [für] (https://ss64.com/bash/for.html) - Erweitern Sie die Wörter und führen Sie die Befehle einmal für jedes Mitglied in der Ergebnisliste aus, wobei der Name an das aktuelle Mitglied gebunden ist. DavidPostill vor 6 Jahren 0
Lieber David, hallo, danke für deine Antwort. Ich habe die Formel für / f "tokens = 1 *"% i in (links.txt) ausprobiert. Wget -O "% j" "% i" In Linux, obwohl es nicht funktioniert. Nur cmd, ich habe keinen Beitrag gefunden, wo es heißt, wie man das in Linux macht. Könntest du helfen, wie es geht? Wenn ja, vielen Dank Mike vor 6 Jahren 0
Wollen Sie diesen Windows-Befehl in einen entsprechenden Linux-Befehl übersetzen? Wenn dies der Fall ist, geben Sie dies bitte deutlich in der Frage an, da es derzeit schwer zu verstehen ist, was Sie versuchen. Es ist keine "Formel", ein "Befehl" ist der richtige Begriff. Schließlich ist der Kommentar von DavidPostill richtig. Sie müssen uns Ihre Versuche zeigen und sagen, wo Sie feststecken. Wir können Ihnen helfen, aber Ihre Arbeit nicht machen. gronostaj vor 6 Jahren 0
Lieber Gronostaj, hallo, habe die Frage entsprechend Ihrem Vorschlag bearbeitet. Ich sagte genau das, was ich tue, das ist der Befehl, den ich oben in cmd erläutert habe. Der Post ist für die Hilfe, wenn jemand weiß, wie man diesen Befehl in Linux-Centos 6,64 übersetzt, weil Linux nicht funktioniert und kein Tutorial dazu gefunden hat. Vielen Dank Mike vor 6 Jahren 0
DavidPostill gab einen Link zu einer Erläuterung der `for`-Schleife in bash, der am häufigsten verwendeten Shell von Linux. Hast du es gelesen? Was hast du versucht? gronostaj vor 6 Jahren 0

1 Antwort auf die Frage

2
Hastur

awk

Auch wenn es möglich ist, aus einer Datei zum Lesen und Verfassen Sie den Befehl, in einem Zyklus wollen gibt es einen Befehl Sie mehr gemütlich finden: awk.

Wenn der Dateiname keine Leerzeichen enthält, können Sie diese einfache Syntax verwenden, um den gewünschten Befehl zu erstellen, und |diese Ausgabe an eine Shell ( sh) umleiten, die sie ausführt.
Mit $1Ihnen nehmen Sie die 1. Spalte, mit $2der zweiten und so weiter ...

awk '' links.txt | sh 

Wenn die Namen Leerzeichen enthalten, müssen Sie mehr trainieren:

awk -F $'\t' '' links.txt | sh 

Hier müssen Sie angeben, dass das Feldtrennzeichen -Fdas Tabulatorzeichen ( -F $'\t') ist, und Sie müssen "den Dateinamen vor und nach dem Dateinamen drucken . Da Sie sich in einem String befinden, müssen Sie sie [ 2 ] umgehen
echo "Those are double quote\"".

Versuchen Sie diesen Befehl ohne Umleitung (also ohne die | sh), um die Möglichkeit zu haben, den Ausgang zu steuern, und führen Sie ihn dann aus, wenn Sie sich sicher sind ...

Verwenden Sie man awkfür weitere Hilfe.

Hallo Hastur, vielen Dank, funktioniert perfekt, danke Mike vor 6 Jahren 1
Ypu kann einen anderen Pfad hinter dem `-O \" `und vor dem` "` ... hinzufügen, oder Sie können das Skript vom endgültigen Verzeichnis aus anpassen. Übrigens __Warning: __ Für die Unix-Dateinamen dürfen _not common_-Zeichen als Zeilenumbrüche verwendet werden, was zu Unordnung in Ihrem Plan führen kann. Die Suche nach _why ist nicht sicher / günstig, um ls output_ zu analysieren, um mehr zu erfahren ... Hastur vor 6 Jahren 1
Hallo @Hastur, danke für die bisherige Erklärung. Wenn ich in der Datei nur eine Spalte mit Link (also nicht zwei Spalten) habe und möchte, dass wget eine Datei mit demselben Namen wie die Spalte 1 speichert, wie könnte ich diesen Befehl dafür aktualisieren? `awk '' links.txt | sh` Ich habe versucht, einfach die $ 2 zu löschen, aber es hat nicht funktioniert. Vielen Dank Joao vor 5 Jahren 0
@Joao Normalerweise "awk" 'links.txt | / bin / sh` sollte funktionieren ... und die Datei mit dem ursprünglichen Dateinamen speichern. Beachten Sie, dass die Option "-O" den Namen der Ausgabe angibt ... "man" könnte ein guter Freund sein (in diesem Fall "man wget"). `:-)` Aber es ist ein Overkill ... sehen Sie was mit `wget -i links.txt` passiert. Wieder ist "man" wirklich ein guter Freund! __ ":-)" Hastur vor 5 Jahren 0
Hi @Joao 1st: Wenn du deine eigene Frage hast, ist es besser, als neue Frage zu posten, die im Kommentar zu stellen ist (mehr Platz und es kann auch für andere nützlich sein). Zweitens: Der Fehler hängt davon ab, was Sie in der Datei `:-)` haben. In der Frage können Sie eine Zeile der Datei hinzufügen, um sie als Beispiel zu geben. 3.: "Mann" ist die Hilfe unter Linux. Viertens: Sehen Sie sich ein Beispiel für die Funktionsweise von `awk` (` gawk`) an: Es setzt Strings zeilenweise zusammen und fügt an einigen Stellen Text aus der Eingabe ein (`$ 1` die` 1st`-Spalte, `$ 2` the 2nd .. also `... wget -O / outputfolder /" $ 1 ".txt", $ 1 ", um an dieser Stelle .txt hinzuzufügen. Hastur vor 5 Jahren 0
Hallo @Hastur, vielen Dank, es hat hier Fehler gegeben, auch den Mann gelesen aber konnte keine Lösung finden. Also habe ich meine neuen Kommentare hier gelöscht, die nicht zur Lösung gelangten, also können Sie einen neuen Beitrag machen, wie Sie es vorgeschlagen haben. Vielen Dank Joao vor 5 Jahren 0