Was ist die beste Möglichkeit, die Platzhaltererweiterung in Bash zu verwenden, wenn Quelle und Ziel ähnlich sind?

Was ist die beste Möglichkeit, die Platzhaltererweiterung in Bash zu verwenden, wenn Quelle und Ziel ähnlich sind?

Angenommen, ich habe diese Ordner:

$ ls
css-tricks/ django-tutorial/ good-tuts.txt js-tut/ tutorials/ tuts.txt

Einige davon haben tutin ihren Namen. Ich möchte alle Dateien/Ordner, die tutin 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* tutorialsund 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_tutverschieben 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 tutorialses 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 tutnicht unmittelbar die Zeichenfolge folgt orials. Das Muster würde nicht übereinstimmen tutorialsund auch übersprungen werden tutorials1usw.

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.

verwandte Informationen