Wie leite ich die Ausgabe von Tar durch mv weiter?

Wie leite ich die Ausgabe von Tar durch mv weiter?

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.0Verzeichnis befinden. Ich möchte dieses moksha-0.1.0Verzeichnis lieber in umbenennen moksha, anstatt es moksha-0.1.0in 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 tarHandbuchseite:

--transform=AUSDRUCK, --xform=AUSDRUCK
    Verwenden Sie sed replaceAUSDRUCKum Dateinamen zu transformieren.

Damit seddies funktioniert, ist es wahrscheinlich erforderlich. Wenn Sie jedoch haben wget, haben Sie wahrscheinlich sedauch.

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ö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.

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— mvliest keine Quelldateien von der Standardeingabe. In diesem Fall ist es am besten, entweder tardas Zielverzeichnis zu ändern (wie inDee Effs Antwort) oder nachträglich umzubenennen (wie inWildcards Antwort).

Ich bevorzuge Ersteres, verwende dabei jedoch -Cund --strip-componentsanstelle von --transform:

mkdir moksha && wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz |
  tar -xzC moksha --strip-components=1

( -CWillenicht, tatsächlich sein Argument erstellen – zumindest nicht auf den BSD- oder GNU-Systemen meines Systems tar.)

Dies ist portabler (BSD tarhat kein --transform) und ändert keine Dateinamen, die die Zeichenfolge moksha-0.1.0an anderer Stelle enthalten – stattdessen wird einfach die erste Komponente des Pfads jeder extrahierten Datei entfernt (zB moksha-0.1.0/ABOUT-NLSwird nur ABOUT-NLS). Da tarin 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.

verwandte Informationen