Unter Linux benenne ich manchmal Dateien wie folgt um:
mv dir1/dir2/dir3/file.txt dir1/dir2/dir3/file.txt.old
Beachten Sie, dass ich die Datei nur umbenennen und nicht in ein anderes Verzeichnis verschieben möchte.
Gibt es einen Befehl, mit dem ich eine Kurzversion dieses Befehls ausführen kann? Ich denke etwas wie:
mv dir1/dir2/dir3/file.txt file.txt.old
oder vielleicht sogar so etwas wie (einfach an den Namen anhängen):
mv dir1/dir2/dir3/file.txt {}.old
Mein Ziel ist es, nicht noch einmal den vollständigen Pfad angeben zu müssen.
Ich weiß, dass diese "Beispiele", die ich geschrieben habe, nicht funktionieren, aber es ist nur eine Idee von dem, was ich erreichen möchte.
Ich möchte nicht in das Verzeichnis hineingehen müssen.
linux
filesystems
files
mv
Santiago Arizti
quelle
quelle
(cd dir1/dir2/dir3 && exec mv file.txt{,.old})
effektiv die gleiche Leistung wie der Code ohne den Unterprozess hat, da dies während des externen Befehlsaufrufsexec
vermieden wirdfork()
, sodass Sie genau eine Verzweigung in beide Richtungen haben.Antworten:
für eine einzelne Datei versuchen
Wohin das
X{a,b}
Konstrukt erweitert wird,Xa Xb
können Sie mit eine Vorschau anzeigenum zu sehen, ob es Ihren Bedürfnissen entspricht.
Hinweis:
das für mehrere Dateien
Es ist unwahrscheinlich, dass Sie das erreichen, was Sie wollen. (Dies wird zu einer Mischung aus file.txt file1.txt.old file2.txt erweitert ...)
{txt,txt.old}
kann laut{,.old}
Kommentar gekürzt werdenWenn der Verzeichnisname eindeutig ist, kann ein Platzhalter verwendet werden.
für die Verwendung mehrerer Dateien
rename
Drop
-n
wirksam Umbenennungs haben.quelle
mv dir1/dir2/dir3/file.txt{,.old}
nicht auch funktionieren und noch kürzer sein?Der Befehl
rename
benennt alle übereinstimmenden Dateien um. Der Hauptzweck besteht darin, mehrere Dateien umzubenennen. Wenn der Perl-Ausdruck jedoch nur einer Datei entspricht, wird nur diese eine Datei umbenannt. Details und Distro spezifischen Syntax lesen Sie bitte die Hilfeseite:man rename
.Anwendungsbeispiel: Benennen Sie "/path/file.txt" in "/path/file.txt.old" um:
rename 's/file.txt/file.txt.old/g' /path/file.txt
Kürzere Notation (dank Shalomb):
Für einen Trockenlauf verwenden
rename -n
.Weitere Beispiele und Details finden Sie unter https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
quelle
rename
Befehle mit völlig unterschiedlichem Verhalten..old
an den Dateinamen, es ist wahrscheinlich ein bisschen bequemer , ein zu tun ,rename 's/$/.old/' /path/to/file.txt
oderrename '$_.=".old"' /path/to/file.txt
Wenn ich in einem Einzelfall mein aktuelles Verzeichnis nicht ändern möchte, verwende ich möglicherweise nur eine Sub-Shell:
Da Sie sich
cd
in der Sub-Shell befinden, haben Sie Ihr Verzeichnis in Ihrer tatsächlichen Shell nicht geändertquelle
&& exec mv
- auf diese Weise versuchen Sie nicht, die Umbenennung durchzuführen, wenn diecd
fehlschlägt undexec
die Subshell verbraucht wird, wodurch eine Leistungsbeeinträchtigung vermieden wird.&&
Ich stimme dem zu Für einen einmaligen Fall würde ich mir, wie gesagt, keine Sorgen um die Kosten der Unterschale machen (halten Sie es einfach: es ist wichtiger, dass Sie sich leicht merken können, wie es geht, IMO)Ich mag @ archemars Lösung, die {} -Erweiterung zu verwenden, weil Sie sie verwenden können, wenn Sie Ihre Befehlszeile bereits gestartet haben. Hier einige weitere Möglichkeiten zur Vollständigkeit:
(Anführungszeichen sind nur erforderlich, wenn der Name Leerzeichen oder andere Zeichen enthält, die das Wort brechen.)
Anmerkungen:
mymv
kann jede sinnvolle Zeichenfolge sein, ich habe mymv für "my move" verwendet.Noch einer:
aber
(von @Adam und @CharlesDuffy) ist wohl besser, wenn die CD ausfällt.
quelle
mmv
, es gibt bereits ein Programm mit diesem Namen.Wenn Sie das Unterverzeichnis eingeben möchten, um den Befehl zu verkürzen
mv
, aber anschließend zum aktuellen Verzeichnis zurückkehren möchten, haben Sie zwei Möglichkeiten. Einer ist, dascd
undmv
in eine Unterschale zu setzen (wie bereits vorgeschlagen).Das andere ist, Verzeichnisse zu benutzen
pushd
undpopd
zu wechseln:Der
pushd
Befehl ist wie folgtcd
, außer dass zuerst der Name des aktuellen Verzeichnisses auf einen Stapel verschoben wird.popd
Entfernt den obersten Namen vom Stapel und wechselt in dieses Verzeichnis.quelle
pushd
undpopd
sind Erweiterungen für die interaktive Verwendung - POSIX listet sie explizit als "Ergebnisse sind nicht spezifiziert" auf, und eine Shell, die zum Ausführen von Skripten (dh in einer minimalen eingebetteten Umgebung) erstellt wurde, muss sie nicht unterstützen.Ich würde es einfach tun
quelle
Die Lösung beinhaltet:
mv something{.txt,.txt.old}
Verwenden Sie einen "Bashismus". Wenn Sie eine portablere Möglichkeit wünschen, verwenden Sie allgemeine Variablenmanipulationen:quelle
${var/text/replacement}
ist ein bashism selbst.