Wie verschiebe ich rekursiv alle Dateien (auch versteckte) in einem Unterordner in einen übergeordneten Ordner in * nix?

14

Dies ist eine etwas peinliche Frage, aber ich muss zugeben, dass ich in meiner späten Karriere immer noch Fragen zum Befehl mv habe.

Ich habe häufig das Problem, dass ich alle Dateien rekursiv um eine Ebene nach oben verschieben muss. Nehmen wir an, ich habe Ordner foo und eine Ordnerleiste darin. Bar hat ein Durcheinander von Dateien und Ordnern, einschließlich Punktdateien und -ordnern. Wie verschiebe ich alles in bar auf das foo-Level?

Wenn foo leer ist, verschiebe ich einfach den Balken eine Ebene darüber, lösche foo und benenne den Balken in foo um. Ein Teil des Problems ist, dass ich nicht herausfinden kann, was der Platzhalter von mv für "alles einschließlich Punkte" ist. Ein Teil dieser Frage ist folgende: Gibt es eine eingehende Diskussion der Platzhalter, die cp- und mv-Befehle irgendwo verwenden (googeln bringt nur sehr grundlegende Tutorials mit sich)?

Deadprogrammer
quelle

Antworten:

19

In Bash (und einigen anderen) können Sie die geschweifte Klammer verwenden, um dies in einer Zeile zu erreichen:

mv bar/{,.}* .

Das Komma trennt eine Null und einen Punkt, sodass der mvBefehl Dateinamen sieht, die mit *und übereinstimmen.*

Bis auf weiteres angehalten.
quelle
Auch dieser Versuch, '..' zu verschieben, schlägt mit der Meldung 'Ressource ist ausgelastet' fehl. Funktioniert trotzdem.
Xananax
3
Vorgeschlagen von einem anonymen Benutzer:To eliminate the error caused by also matching "." and "..", use this command: mv bar/{,.[!.],..?}* .
HopelessN00b
2

Der einfachste Weg, dies zu tun, besteht darin, es mit zwei Befehlen zu tun, da * nicht übereinstimmt

cd /foo
mv bar/* ./
mv bar/.??* ./

Du willst nicht bar /.* benutzen, was ich herausgefunden habe, als ich diesen Fehler begangen habe:

rm -rf ./.* 

Dies ist eine schlechte Sache. Möchte jemand raten warum? ;-)

Matt Simmons
quelle
Ich glaube nicht, dass sich Bash oder Zsh .*zu .und ausdehnen ... Zsh jedenfalls nicht für mich.
Mikael S
Mikael: Ich kann versprechen, dass Bash funktioniert (oder zumindest funktioniert hat), da ich Benutzerverzeichnisse wiederherstellen musste, die ich dadurch gelöscht habe
Matt Simmons,
2

Das erste, was Sie über Globbing wissen sollten - es wird von der Shell ausgeführt, nicht vom Befehl. Überprüfen Sie die Manpage Ihrer Shell auf alle Details.

Jeff Leyser
quelle
2

Dieser sammelt alle Dateien aus Unterordnern und verschiebt sie in das aktuelle Verzeichnis

find . -type f -exec mv -iv \{} . \;

Wenn Sie Dateien mit demselben Namen erstellen möchten, verwenden Sie

yes y | find . -type f -exec mv -iv \{} . \;
Michelek
quelle
1

mv .??* *kümmert sich um alles außer Punkt, gefolgt von einem einzelnen Zeichen. Wenn das für Ihre Situation üblich ist, können Sie hinzufügen .[a-zA-Z0-9]*. Das wird noch Dateien mit Namen lassen wie .;, .^und .^I(tab). Wenn Sie mit allem fertig werden müssen, müssen Sie etwas komplexer sein.

mv .. `ls -f | egrep -v '^.$|^..$'
mpez0
quelle
0

Wenn Sie eine Verzeichnisstruktur haben /foo/bar/und alle Dateien in bareinem Schritt oben verschieben möchten , gehen Sie in das barVerzeichnis und geben Sie Folgendes ein:

find . -depth -print0 | cpio --null -pvd ../

Im Allgemeinen denke ich, cpio(1)ist für diese Art von Aufgaben besser. Sie können die detaillierte Dokumentation überprüfen, indem Sie sie info cpioin Ihrer Shell ausgeben .

fim
quelle