Lösung 1:
für eine einzelne Datei versuchen
mv dir1/dir2/dir3/file.{txt,txt.old}
wo der X{a,b}
Konstrukt zu Xa Xb
erweitern , können Sie mit
echo dir1/dir2/dir3/file.{txt,txt.old}
um zu sehen, ob es Ihren Anforderungen entspricht.
Hinweis:
-
das für mehrere Dateien
mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
ist unwahrscheinlich zu erweitern, was Sie wollen. (Dies wird zu einer Mischung aus file.txt file1.txt.old file2.txt ...)
erweitert-
{txt,txt.old}
kann auf{,.old}
gekürzt werden gemäß Kommentar -
bei eindeutigen Verzeichnisnamen kann Platzhalter verwendet werden.
mv *1/*2/d*/*.{,old}
Verwenden Sie für mehrere Dateien rename
rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt
lass -n
fallen um eine effektive Umbenennung zu haben.
Lösung 2:
Der Befehl rename
benennt alle übereinstimmenden Dateien um. Sein Hauptzweck besteht darin, mehrere Dateien umzubenennen, aber wenn der Perl-Ausdruck nur mit einer Datei übereinstimmt, wird nur diese einzelne Datei umbenannt. Für Details und Distributions-spezifische Syntax lesen Sie bitte die Manpage:man rename
.
Verwendungsbeispiel:"/path/file.txt" in "/path/file.txt.old" umbenennen:
rename 's/file.txt/file.txt.old/g' /path/file.txt
Kürzere Schreibweise (dank shalomb):
rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt
Verwenden Sie für einen Probelauf rename -n
.
Weitere Beispiele und Details finden Sie unter https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
Lösung 3:
Ich mag die Lösung von @archemar, die {}-Erweiterung zu verwenden, weil Sie sie verwenden können, wenn Sie Ihre Befehlszeile bereits gestartet haben. Hier sind einige andere Möglichkeiten der Vollständigkeit halber:
F="dir1/dir2/dir3/file.txt" ; mv "$F" "$F.old"
(Anführungszeichen sind nur notwendig, wenn Sie Leerzeichen oder andere Wörter trennende Zeichen im Namen haben)
mymv() {
mv "$1/$2" "$1/$3"
}
mymv dir1/dir2/dir3 file.txt file.txt.old
mymv dir5/dir6/dir7 file.txt file.txt.old
Hinweise:
- Dies ist Bash-Syntax, Sie verwenden möglicherweise eine andere Shell
mymv
kann jede vernünftige Zeichenkette sein, ich habe mymv für "my move" verwendet.- Die Funktionsdefinition kann in Ihr .bash_profile eingefügt werden
Noch einer:
cd dir1/dir2/dir3 ; mv file.txt file.txt.old ; cd -
aber
(cd dir1/dir2/dir3/ && exec mv file.txt file.txt.old)
(von @Adam und @CharlesDuffy) ist wohl besser, falls die CD fehlschlägt.
Lösung 4:
Für einen einmaligen Fall, wenn ich mein aktuelles Verzeichnis nicht ändern möchte, kann ich einfach eine Sub-Shell verwenden:
(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)
Weil Sie cd
innerhalb der Sub-Shell haben Sie Ihr Verzeichnis in Ihrer eigentlichen Shell nicht geändert
Lösung 5:
Wenn Sie das Unterverzeichnis eingeben möchten, um den mv
zu kürzen Befehl ausführen, aber danach zum aktuellen Verzeichnis zurückkehren möchten, gibt es zwei Möglichkeiten, dies zu tun. Eine besteht darin, cd
zu setzen und mv
in einer Subshell (wie bereits vorgeschlagen).
Die andere ist die Verwendung von pushd
und popd
Verzeichnisse wechseln:
pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd
Diepushd
Befehl ist wie cd
, außer dass es zuerst den Namen des aktuellen Verzeichnisses auf einen Stapel legt. popd
entfernt den obersten Namen aus dem Stack und wechselt in dieses Verzeichnis.