Ich entschuldige mich, dass dies eine so blöde Frage ist, aber ich kann es mir nicht leisten, sie zu vermasseln.
Ich habe eine Reihe von Ordnern wie folgt:
/ users / me / foo / oops1
/ users / me / foo / oops2
/ users / me / foo / oops3
/ users / me / foo / oops4
/ users / me / foo / bar
Leider sind sie nicht einheitlich benannt und es gibt Hunderte von Oops-Ordnern.
Ich wollte alle oops-Ordner in die Leiste kopieren. Gibt es eine einfache Möglichkeit, alle oops-Ordner in die Leiste zu verschieben, die nicht zu einem rekursiven Verschiebungsproblem führen?
Das Kopieren der Dateien dauerte mehrere Stunden. Ich hoffe, dass der Umzug viel schneller sein wird.
Dies ist übrigens auf einem Red Hat Linux Server. Ich habe nur ssh zugang
Ich denke, wenn ich es tue
cd foo
mv * bar
Es wird ein Problem geben.
quelle
Antworten:
Leider weisen sowohl Matts als auch Nicoles Antwort einen schlechten Stil auf und werden
*
beschädigt , wenn einer der Ordner sogar ein einzelnes Leerzeichen, ein Globbing- Zeichen (wie ) oder eine neue Zeile enthält. Das Laufenfor item in $(ls …)
ist ein großer Fehler, den man machen kann, weil er sie früher oder später beißt, und das Iterieren über Dateinamen, die nicht richtig ausgegeben werden, kann alle möglichen Probleme verursachen.Analysieren Sie niemals die Ausgabe von
ls
.Unter Linux gibt es ein Tool zum Suchen von Dateien, die bestimmten Kriterien entsprechen. Es heißt
find
:Dadurch werden alle Verzeichnisse im aktuellen Arbeitsverzeichnis verschoben, in die nicht aufgerufen
bar
wurde./bar/
. Dies funktioniert auch, wenn die Verzeichnisnamen Leerzeichen, Zeilenumbrüche oder Zeilenumbrüche enthalten.Der reguläre Ausdruck
.\/bar$
stimmt nur mit dem aufgerufenen Verzeichnis überein./bar
und wird von negiert!
.quelle
mv
für jede Datei einmal ausgeführt wird. Und mit so vielen Begriffen bietet es viele Möglichkeiten, einen Fehler zu machen.bash
benötigt und fehlt eine bessere Substitutionseinrichtung, die mit Dateinamen mit Leerzeichen umgehen kann.mv
einmal für jeden Ordner ausgeführt , nicht für jede Datei. Ich glaube,\+
damit sollte es schneller laufen und alle Ordner in einem Befehl verschieben, obwohl ich nicht weiß, ob das eine größere Beschleunigung verursachen würde. Ich stimme Ihnen zu, dass dies viel einfacher sein sollte, da der einfachste Weg, mit Dateien in Bash umzugehen , leider nie der richtige ist. Ich hatte nur das Gefühl, dass es eine Antwort geben musste, die auf jeden Fall funktionieren würde.Was Sie vorschlagen, ist genau richtig.
mv
ist schlau genug und wird folgendes sagen:Alle deine oopsx-Verzeichnisse befinden sich jedoch in der Leiste.
quelle
Ja, du hast recht, das wäre ein Problem, denn es
*
wird auch passenbar
; Sie können nichtmv
in sich selbst verzeichnen.Der technisch anspruchsvolle Weg besteht darin, die Befehlsersetzung und eine Schleife
mv
nur für die Dinge zu verwenden, die nicht vorhanden sindbar
. Inbash
könnten Sie zum Beispiel so etwas schreiben, aber beachten Sie, dass es fehlschlägt, wenn es auf einen Namen trifft, der ein Leerzeichen enthält.Aber ehrlich gesagt bin ich faul. Ich würde
mv
aus dem Weg räumen, dannmv
alles hinein und es dann zurück bewegen. Sie verschieben nur Links zum Dateisystem, nicht zum Dateiinhalt. Das geht also schnell. Dies hat auch den Vorteil, dass Sie arbeiten können, wenn Sie Namen mit Leerzeichen haben.quelle
"foo baz"
würde beispielsweise als angezeigtmv foo baz bar
und anschließend fehlschlagen.bash
, das behoben werden sollte (es ist in meiner C-Shell behoben ), (c) dies ist ein guter Grund dafür den zweiten weg, den ich eigentlich empfohlen habe.*
übereinstimmenbar
, ist es nicht ein Problem , da ‚mv‘ / ist der Kern intelligent genug , um diese Instanz zu erkennen. Es ist also kein Problem, sondern eine gute Möglichkeit, dies zu tun (es sei denn, Sie möchten bestimmte Verzeichnisse herausfiltern, aber das ist eine andere Frage)Wenn Sie sich sicherer fühlen, können Sie dies in BASH tun:
quelle
grep -v '^bar$'
um nur "bar" zu entsprechen.ls -d
gibt dir nur.
das aktuelle Arbeitsverzeichnis. Sind Sie sicher, dass dies funktioniert? Hast du den Befehl ausprobiert? Siehe: Wie liste ich Ordner mit Bash-Befehlen auf? - Außerdem schlägt dieses Skript fehl, wenn in einem der Verzeichnisse ein Leerzeichen, ein Zeilenumbruch oder ein abschließendes Zeichen enthalten ist.cd in foo
der allgemeineren
quelle