Gibt es eine clevere Möglichkeit, Kopier- und Verschiebevorgänge oder einen Befehl zum Duplizieren einer Datei auszuführen, ohne cd
danach einen Befehl mv
im selben Ordner ausführen zu müssen ?
Zum Beispiel muss ich Folgendes ausführen:
mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
Beachten Sie, dass das Verzeichnis, in das ich die Datei verschiebe, dasselbe ist, aber ich muss den gesamten Pfad erneut eingeben, und manchmal wird es ärgerlich. Ich bin gespannt, ob es eine andere Möglichkeit gibt, dies zu tun, ohne den gesamten Pfad erneut eingeben zu müssen , da die Operation auf demselben Pfad ausgeführt werden würde.
Antworten:
Verwenden Sie einfach die Klammererweiterung :
Dies entspricht dem Schreiben:
Mit der Klammererweiterung können Sie natürlich mehr Argumente angeben. Sie können sogar Bereiche , um es zB passieren ein paar Test Ordner zu erstellen, können Sie laufen
mkdir test_{a..z}
, und beginnend mit Bash 4 können Sie mit Nullen aufgefüllt Sequenzen als auch erzeugen, wie intouch foo{0001..3}
, das schafftfoo0001
,foo0002
undfoo0003
. Das Bash Hackers Wiki hat einen Artikel mit ein paar Beispielen für Sie.Wenn Sie zwei verschiedene Befehle verwenden müssen, verwenden Sie zuerst eine Subshell und
cd
dort, wie in der Antwort von @ Ignacio .quelle
brace
Erweiterung, danke!meniac ~: mv /tmp/f1/f2/f3/f4/f5/f6/{file.txt, file2.txt} mv: cannot stat ``/tmp/f1/f2/f3/f4/f5/f6/{file.txt,': No such file or directory
/bin/bash
und sich nicht in einem Skript befinden, das sich/bin/sh
im shebang befindet, oder in einer anderen Shell, die keine Klammererweiterung unterstützt? Wenn du rennstset
, ist deinSHELLOPTS
Inhaltbraceexpand
?file.txt,
und kein Leerzeichen stehen darffile2.txt
.mv /folder1/folder2/folder3/file{,-2013}.txt
Führen Sie die Operation in einer Subshell aus.
Die Änderung des Arbeitsverzeichnisses wird nicht an die übergeordnete Shell weitergegeben.
quelle
ash
,dash
,ksh88
Nicht die alte Bourne - Shell Beispiel Schalen nicht unterstützt zu erwähnen.Wenn Sie klug sein möchten, finden Sie hier eine Erweiterung des Bash- Verlaufs
Ich würde das nicht selbst benutzen, da ich es unmöglich finde, es mir zu merken. Ich verwende gelegentlich das vim-Äquivalent , muss es aber fast jedes Mal nachschlagen.
quelle
Sie können eine Variable festlegen. Dies hat natürlich den Nebeneffekt, dass die Variablen nicht verändert werden.
quelle
(D="/folder1/folder2/folder3"; mv "$D"/file.txt "$D"/file-2013.txt)
, indem Sie die gesamte Befehlszeile in eine Unterschale setzen: oder indem Sie einfach einenunset
Befehl am Ende hinzufügen . (Ich habe Zitate als „Best Practice“ hinzugefügt. Wenn Sie es sich zur Gewohnheit machen, immer Zitate zu verwenden, müssen Sie nicht aufhören und sich den Kopf kratzen, wenn ein Pfadname mit Sonderzeichen auftaucht.)cd
eine Variable festzulegen, als sie zu verwenden. Nicht viel einfacher, gebe ich zu.Ich mag die anderen Lösungen, aber hier ist eine andere, implementiert als Skript mit Bash-Arrays, pushd, popd:
quelle
Slhck beantwortet die Frage direkt auf die einfachste Art und Weise, aber Valter mag auch die Autopop-Antwort.
quelle