Schnellste Methode zum Umbenennen von Dateien, ohne den Verzeichnispfad erneut eingeben zu müssen

56

Ich kann Dateien in Unix umbenennen:

$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh

     ^-------this part------^    ^------this part-------^

Das zweimalige Wiederholen dauert zu lange ~/folder/subfolder/file.

Gibt es einen schnelleren Weg?

Hamed Kamrava
quelle

Antworten:

104

Wenn Ihre Shell unterstützt Brace Expansion (funktioniert mit csh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yashmit Klammer-expand durch Aufruf aktiviert yash --brace-expandoder eingestellt in interative Schale mit set -o brace-expandoder fish):

mv ~/folder/subfolder/file.{txt,sh}
cuonglm
quelle
4
einfach ist das Beste!
Braiam
2
genialer einsatz der expansion in der schale genial!
harish.venkat
3
Es ist großartig, aber wirklich kryptisch. Es funktioniert, aber auf den ersten Blick würde ich meinen, es macht etwas anderes: verschiebt zwei Dateien irgendwo hin. Ich denke nicht, dass dies eine großartige Idee ist, zumal es eine viel bessere Lösung gibt rename.
Du
4
@tohecz: Warum ist es kryptisch? Es ist ein Feature von Shell und jeder kann es durch Lesen der Shell-Manpage erkennen. Und ich denke nicht, dass renamees eine bessere Lösung ist, weil Sie renamenie gefragt werden, ob Sie die vorhandene Datei überschreiben möchten oder nicht.
Dienstag,
1
@ Gnouc du bist der Mann.
Anfänger
20

Sie können auch rename(Teil des Pakets util-linux) verwenden.

rename .txt .sh ~/folder/subfolder/file.txt

Weitere Informationen finden Sie auf der Manpage zum Umbenennen .

Jofel
quelle
+1 Dies ist die eindeutige Vorgehensweise, viel besser als sich auf die {a,b}Funktionalität von Shells zu verlassen .
Du bist
5
In einigen Linux-Distributionen (wie Ubuntu) renamehandelt es sich um ein völlig anderes, auf Perl basierendes Programm. Dort würdest du verwenden rename 's/txt$/sh/' ~/folder/subfolder/file.txt.
Übelsuppe
Auf Debian (und Ubuntu) gibt es auch mmv.
Strg-Alt-Delor
10

Alle oben genannten sind gut. Das würde auch funktionieren:

( cd ~/folder/subfolder && mv file.txt file.sh )
Björn
quelle
Nein, es funktioniert nicht für mich!
Hamed Kamrava
Es funktioniert, wenn Sie das sudoTeil entfernen .
Cthulhu
1
@ Cthulhu Ja, du hast Recht. Aber warum funktioniert das nicht mit sudo?
Hamed Kamrava
2
@HamedKamrava Wahrscheinlich, weil sudoes ~als Basisverzeichnis des Stamms interpretiert wird .
Cthulhu
Sie können sudodas mv, aber nicht cd. Sehen Sie, warum CD ist eine Shell eingebaut. Und Sie können nicht sudodie(
Strg-Alt-Delor
6

Nein. Um die Datei umzubenennen, müssen Sie den vollständigen Pfad angeben. Die einzige Alternative besteht darin, in den Zielordner zu wechseln, bevor Sie Folgendes ausführen mv:

cd ~/folder/subfolder/
mv file.txt file.sh

Alternativ können Sie eine kleine Funktion schreiben, die die Datei im Zielverzeichnis umbenennt. Fügen ~/.bashrcSie Ihrer Shell-Initialisierungsdatei beispielsweise die folgenden Zeilen hinzu ( falls Sie verwenden bash):

lmv(){
    _path=$(dirname -- "$1")
    _target="${_path%/}/$2"
    mv -- "$1" "$_target"
}

Öffnen Sie dann ein neues Terminal oder führen source ~/.bashrcSie das Programm aus, um die Init-Datei erneut zu lesen.

lmv ~/folder/subfolder/file.txt file.sh
terdon
quelle
+1 für lmv()Funktion. Ich wusste das nicht :)
Hamed Kamrava
1
@HamedKamrava niemand wusste es. Ich habe es gerade geschrieben, es ist nichts Standard.
Terdon
2
Ich weiß. Ich meine, ich wusste nicht, dass ich meine eigene Funktion schreiben kann!
Hamed Kamrava
2

Nur um die Nützlichkeit der Antwort von cuonglm zu erweitern (keine Anerkennung, da ich seine Lösung liebe) und seine Antwort ist richtig.

Der Anwendungsfall ist, dass wir häufig eine Datei an einem entfernten Ort (das eigentliche Problem) speichern möchten, z. B. /folder/subfolder/configFile.dat TO configFile.dat.orig

Diese Form des Befehls fügt eine Dateierweiterung hinzu (ersetzt nicht die ursprüngliche Erweiterung)

mv ~/folder/subfolder/file.txt{,.orig}

Erklärt: "{, .orig}" bedeutet, dass am Ende des Dateinamens (nichts) durch (etwas) ".orig" ersetzt wird.

ODER zum Entfernen einer Dateierweiterung (Umbenennen rückgängig machen)

mv ~/folder/subfolder/file.txt{.orig,}

Hinweis: Noch am Thema für "Schnellste Methode zum Umbenennen von Dateien ohne erneutes Eingeben des Verzeichnispfads"

spikendu
quelle
1

Ja. Wenn Sie verwenden bash, tun Sie sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

Welches ist eigentlich größer und kann fehlschlagen, wenn Sie Zugriffsberechtigungen auf das ursprüngliche Verzeichnis verloren haben, als Sie das getan haben popd.

41754
quelle
1
Was ist der Sinn von pushdund popdhier? Wie ist das besser als cd ~/folder/subfolder/ && sudo mv file.txt file.sh?
Terdon
1
Der Punkt ist, dass Sie sich nach dem Befehl wieder in dem Ordner befinden, den Sie gestartet haben, und nicht in einem Unterordner. Eine Alternative zu pushd popdist zu benutzen cdund zurückzukehren cd -.
Jofel
Der Fragesteller schien die Absicht zu haben, das Arbeitsverzeichnis nicht zu ändern, und popdist besser als cd ../../, wenn verfügbar.
41754
7
Verwenden Sie (cd /path/to/there && mv x y)dann (mit einer Unterschale)
Stéphane Chazelas
Sie sollten wirklich nicht setzen sudovor pushd. So sollte der volle Befehl sein pushd ...dir && sudo mv old new && popd. Alternativ könnte man dies tun, (cd ...dir; sudo mv old new)da das Ausführen in der Subshell die Verzeichnisänderungen automatisch erledigt.
Mikko Rantalainen