Avorherige Fragevon mir wurde gefragt, wie man heruntergeladene Dateien durch tar leitet. Jetzt würde ich gerne wissen, wie man die Ausgabe von tar durch mv leitet. Im Moment habe ich diesen Befehl:
wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz
und dies erstellt ein Verzeichnis namens moksha-0.1.0
, aber ich würde gerne wissen, wie ich dieses Ausgabeverzeichnis in umbenennen könnte moksha
, vielleicht über eine Pipe ( |
) am Ende dieses Befehls. Wenn Sie jedoch wissen, wie das ohne Pipe geht, aber dennoch in derselben Codezeile wie wget und tar, nehme ich das auch gerne an.
Um es klar zu sagen, ich weiß Folgendes:
wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz -C moksha
wird ein Ausgabeverzeichnis erstellen moksha
, aber innerhalb dieses Ausgabeverzeichnisses wird sich das moksha-0.1.0
Verzeichnis befinden. Ich möchte dieses moksha-0.1.0
Verzeichnis lieber in umbenennen moksha
, anstatt es moksha-0.1.0
in einem neuen Verzeichnis namens zu platzieren moksha
.
Antwort1
So was?
[root@b se]# wget -cqO - https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz --transform=s/moksha-0.1.0/moksha/
[root@b se]# ls
moksha
[root@b se]# ls moksha
ABOUT-NLS config.guess debian Makefile.am
aclocal.m4 config.guess.dh-orig depcomp Makefile.in
AUTHORS config.h.in doc missing
autogen.sh config.rpath enlightenment.pc.in netwm.txt
autom4te.cache config.sub enlightenment.spec.in NEWS
BACKPORTS config.sub.dh-orig INSTALL po
BUGS configure install-sh README
ChangeLog configure.ac intl src
compile COPYING ltmain.sh xdebug.sh
config data m4 x-ui.sh
Aus der tar
Handbuchseite:
--transform=AUSDRUCK, --xform=AUSDRUCK Verwenden Sie sed replaceAUSDRUCKum Dateinamen zu transformieren.
Damit sed
dies funktioniert, ist es wahrscheinlich erforderlich. Wenn Sie jedoch haben wget
, haben Sie wahrscheinlich sed
auch.
Antwort2
Hinweis: Meine Antwort bezieht sich nicht wirklich auf tar
; es handelt sich dabei speziell um eine Antwort auf diesen Teil Ihrer Frage:
...dadurch wird ein Verzeichnis mit dem Namen erstellt
moksha-0.1.0
, aber ich würde gerne wissen, wie ich dieses Ausgabeverzeichnis in umbenennen könntemoksha
, vielleicht über eine Pipe (|
) am Ende dieses Befehls. Wenn Sie jedoch wissen, wie das ohne Pipe geht, aber dennoch in derselben Codezeile wie wget und tar, nehme ich das auch gerne an.
Eine Pipe verbindet die Standardausgabe eines Befehls mit der Standardeingabe des nächsten. Mit Dateien hat sie nicht viel zu tun – schon gar nicht mit dem Verschieben von Dateien, die von einem vorherigen Befehl in einer Pipeline erstellt wurden.
Was Sie wollen, ist eineListe.
Aus man bash
:
AND and OR lists are sequences of one of more pipelines separated by
the && and ││ control operators, respectively. AND and OR lists are
executed with left associativity. An AND list has the form
command1 && command2
command2 is executed if, and only if, command1 returns an exit status
of zero.
Die einfachste Möglichkeit, eine einfache Wenn-Dann-Prüfung für einen Befehl durchzuführen oder einen Befehl vom Erfolg eines anderen abhängig zu machen, ist die Verwendung von &&
. Beispiele:
[ -r somefile ] && cat somefile
# Checks if somefile exists and is readable; cats the file if it is.
sed -f sedscript inputfile > outputfile && mv outputfile inputfile
# One way (not the best) to edit a file in place.
# The point is that the second command only executes if the first command "succeeds" (i.e. returns a zero exit status).
Geben Sie für Ihren spezifischen Befehl einfach Folgendes ein:
(The whole command you wrote) && mv moksha-0.1.0 moksha
Antwort3
Das geht nichtRohreine Datei durch mv
, per se— mv
liest keine Quelldateien von der Standardeingabe. In diesem Fall ist es am besten, entweder tar
das Zielverzeichnis zu ändern (wie inDee Effs Antwort) oder nachträglich umzubenennen (wie inWildcards Antwort).
Ich bevorzuge Ersteres, verwende dabei jedoch -C
und --strip-components
anstelle von --transform
:
mkdir moksha && wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz |
tar -xzC moksha --strip-components=1
( -C
Willenicht, tatsächlich sein Argument erstellen – zumindest nicht auf den BSD- oder GNU-Systemen meines Systems tar
.)
Dies ist portabler (BSD tar
hat kein --transform
) und ändert keine Dateinamen, die die Zeichenfolge moksha-0.1.0
an anderer Stelle enthalten – stattdessen wird einfach die erste Komponente des Pfads jeder extrahierten Datei entfernt (zB moksha-0.1.0/ABOUT-NLS
wird nur ABOUT-NLS
). Da tar
in das neue Verzeichnis gewechselt ist moksha
, wird alles aus dem Archiv dorthin extrahiert.
Das Archiv, das Sie in Ihrer Frage verlinkt haben, hat nur ein Verzeichnis in seinem Stammverzeichnis, aber es ist wichtig zu beachten, dass die Verwendung dieser Technik auf ein Archiv mitmehrereVerzeichnisse in seinem Stammverzeichnis werden alle Inhalte dieser Verzeichnisse in das durch angegebene Verzeichnis kopiert -C
. In solchen Fällen wäre es besser,Extrahieren und anschließend bei Bedarf umbenennen.