it-swarm.com.de

Berücksichtigen Sie bei MV den Pfad / Namen der Originaldatei, wenn Sie das Ziel auswählen

Angenommen, ich muss die Datei /etc/dir1/dir2/dir3/a.out nach /etc/dir1/dir2/dir3/b.out verschieben.

Das zweimalige Eingeben des gesamten Pfads ist mühsam und das Wechseln in das Verzeichnis ist möglicherweise nicht ideal. Gibt es eine Möglichkeit, eine solche Verschiebung durchzuführen, ohne das Verzeichnis erneut einzugeben?

Auf eine verwandte Frage (die ich vermute, hat die gleiche Lösung). Angenommen, ich möchte eine Datei someverybigfilename.png nach somereallybigfilename.png verschieben. Gibt es eine Möglichkeit, dies zu erreichen, ohne den Namen erneut einzugeben?

(Ich weiß, dass ich ein Skript verwenden kann. Aber unterstützt mv so etwas von Haus aus?)

Kurz gesagt: Wie kann ich move verwenden, um nur einen Teil eines Dateinamens teilweise zu ändern? Wie mache ich eine kleine Änderung wie Erweiterung?

6
josinalvo

Wenn Sie im ersten Fall bash verwenden, können Sie Klammererweiterung verwenden:

mv /etc/dir1/dir2/dir3/{a.out,b.out} 

oder auch

mv /etc/dir1/dir2/dir3/{a,b}.out

Im zweiten Fall können Sie die Klammererweiterung erneut verwenden:

mv some{very,really}bigfilename.png

Oder (obwohl es nicht wirklich viel Tipparbeit spart), können Sie Bash Verlaufserweiterung wie folgt verwenden:

$ mv someverybigfilename.png !#$:s/very/really
mv someverybigfilename.png somereallybigfilename.png
13
steeldriver

entweder

cd /etc/dir1/dir2/dir3/
mv a.out b.out

oder

mache ein Drehbuch wie

#!/bin/bash
dir_Path="/etc/dir1/dir2/dir3/"

mv $dir_Path\a.out $dir_Path\b.out

exit

und umbenennen:

#!/bin/bash
dir_Path="/etc/dir1/dir2/dir3/"
name_part="bigfile.png"
cd $dir_Path
mv some$name_part somereally$name_part

exit
2
DarkPhoenix6

Wenn der Pfad derselbe ist, sehe ich nicht den Grund, warum ich nicht in den Ordner eintrete.

Sie könnten den Pfad mit pushd speichern oder mit cd zurückkommen -

Beispiel:

[email protected]:~$ pushd dir1/dir2/dir3/
~/tmp/dir1/dir2/dir3 ~/tmp
[email protected]:~/dir1/dir2/dir3$ mv a.out b.out
[email protected]:~/dir1/dir2/dir3$ popd
~/tmp
[email protected]:~$ 

oder

[email protected]:~$ cd dir1/dir2/dir3/
[email protected]:~/dir1/dir2/dir3$ mv b.out a.out
[email protected]:~/dir1/dir2/dir3$ cd -
[email protected]:~$ 

Über den Dateinamen kam mir nur der Gedanke, ihn in einer Variablen zu speichern.

2
Luca Giovenzana

Es gibt verschiedene Möglichkeiten, dies zu erreichen. Dies kann über eine Funktion geschehen, die in der Datei ~/.bashrc definiert ist.

pmv(){
    mv "$1"/"$2" "$1"/"$3"
}

Die Funktion pmv würde dann 3 Argumente annehmen. Pfad zum Verzeichnis, zur Quelldatei und zur Zieldatei. Zum Beispiel:

$ ls testdir
self_test.sh*  test.wxg
$ pmv ./testdir  test.wxg  test2.wxg                                                                                     
$ ls testdir                                                                                                             
self_test.sh*  test2.wx

Beachten Sie, dass in dieser Funktion der Verzeichnispfad und der Dateipfad mit einem Schrägstrich verbunden werden. Wenn also der Pfad zum Verzeichnis als Befehlszeilenargument angegeben wird, sollte am Ende kein Schrägstrich stehen. Wir können jedoch die Funktionsdefinition mit bashs Parametererweiterung verbessern, wodurch wir entweder /path/to/dir oder /path/to/dir/ verwenden können:

pmv(){
    mv "${1%/}"/"$2" "${1%/}"/"$3"
}

Auf eine verwandte Frage (die ich vermute, hat die gleiche Lösung). Angenommen, ich möchte eine Datei someverybigfilename.png in somereallybigfilename.png verschieben. Gibt es eine Möglichkeit, dies zu erreichen, ohne den Namen erneut einzugeben?

Tatsächlich gibt es keine Möglichkeit, dies allein mit mv zu tun. Sogar Stahlfahrer- und Minenlösungen für den ersten Teil Ihrer Frage nutzen die Funktionen von bash, nicht die von mv. Weitergehende Umbenennungsmanipulationen, wie beispielsweise das Einfügen von Text in Dateinamen, sollten mit prename durchgeführt werden, wobei Sie reguläre Perl-Ausdrücke verwenden, um Dateien dynamisch umzubenennen.

$ touch someverybigfilename.png

$ prename 's/very/really/' someverybigfilename.png                                                                       

$ ls somereallybigfilename.png                                                                                           
somereallybigfilename.png
1