Angenommen, ich habe diese Ordner:
$ ls
css-tricks/ django-tutorial/ good-tuts.txt js-tut/ tutorials/ tuts.txt
Einige davon haben tut
in ihren Namen. Ich möchte alle Dateien/Ordner, die tut
in ihren Namen haben, in den Ordner verschieben tutorials/
. Wenn ich den Befehl ausführe
$ mv *tut* tutorials/
Ich erhalte folgende Meldung:
mv: cannot move 'tutorials' to a subdirectory of itself, 'tutorials/tutorials'
Was kann ich tun, um ein solches Szenario zu vermeiden?
Einer der Tricks, die mir einfallen, besteht darin, den Zielordner vorübergehend umzubenennen und ihn nach der Ausführung des Befehls wieder in den gewünschten Namen zu ändern. Ich hoffe jedoch, eine elegantere Lösung für das Problem zu kennen.
Antwort1
Persönlich würde ich in einer Situation, in der ich den Befehl interaktiv eingeben möchte, einfach Folgendes tun mv *tut* tutorials
und damit rechnen, dass der Fehler „Verschieben nicht möglich“ auftritt. Das ist harmlos und die anderen Dateien und Verzeichnisse werden wie erwartet verschoben.
Der Beendigungsstatus des Befehls ist ungleich Null und signalisiert damit einen Fehler. Da jedoch nichts davon abhängt, kann er ignoriert werden.
In diesem Fall steht vor den anderen Namen ein Bindestrich tut
:
mv *-tut* tutorials
Oder, wenn Sie auch solche Dinge python_tut
verschieben möchten, lassen Sie zusätzlich einen Unterstrich zu:
mv *[_-]tut* tutorials
Oder, um ein zusätzliches Zeichen vor der Teilzeichenfolge zu verlangen tut
(das tutorials
es nicht gibt),
mv *?tut* tutorials
Mit etwas mehr Tippen und Nachdenken können Sie ein erweitertes Globbing-Muster in verwenden bash
:
shopt -s extglob
mv *tut!(orials*) tutorials
Diese zweite Variante stimmt mit allem überein, das die Teilzeichenfolge enthält, auf die tut
nicht unmittelbar die Zeichenfolge folgt orials
. Das Muster würde nicht übereinstimmen tutorials
und auch übersprungen werden tutorials1
usw.
Antwort2
Sie können auch Folgendes verwenden find
:
find . -type d -name "*tut*" -not -path "./tutorials" -exec mv -t "tutorials" {} +
Antwort3
Ich erhalte folgende Meldung:
mv: cannot move 'tutorials' to a subdirectory of itself, 'tutorials/tutorials'
Ignorieren Sie den Fehler einfach.
Nein, wirklich nicht. Sie wissen, dass Sie den Fehler erhalten werden, da das Glob-Muster mit dem Ziel übereinstimmt. Sie wissen auch, dass es nichts bedeutet, da das System das Verzeichnis nicht in sich selbst verschieben kann und es intelligent genug ist, es zu bemerken, bevor es Ihr Dateisystem durcheinander bringt.
Antwort4
Am einfachsten ist es, das Zielverzeichnis tutorials/
in einen anderen Namen umzubenennen, der nicht mit der Dateinamenerweiterung übereinstimmt, und es nach dem Verschieben nach Wunsch umzubenennen.