Wie verschiebe ich Dateien aus verschachtelten Unterverzeichnissen in einen anderen Ordner in Ubuntu? (Der Versuch, viele Unterordner abzustreifen)

36

Wie verschiebe ich Dateien und nicht Verzeichnisse in einen anderen Ordner / übergeordneten Ordner?

Ich habe eine Ordnerstruktur, die extrem hässlich ist, mit einigen MP3-Dateien, die 6 Ebenen tief in einem Unterordner vergraben sind.

Ich möchte mit Ubuntu alle Dateien (meistens .mp3, aber nicht alle) in einem Verzeichnis ohne Unterverzeichnisse haben.

Hilfe?

Chris
quelle

Antworten:

48

In der askubuntu-QA gibt es eine großartige Antwort .

Öffnen Sie dazu ein Terminal und führen Sie den folgenden Befehl aus:

mv  -v ~/Downloads/* ~/Videos/

Alle Dateien und Ordner werden vom Ordner "Downloads" in den Ordner "Videos" verschoben.


So verschieben Sie alle Dateien, jedoch keine Ordner:

Wenn Sie jedoch alle Dateien (jedoch keine Ordner) vom Ordner "Downloads" in den Ordner "Videos" verschieben möchten, verwenden Sie diesen Befehl

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

So verschieben Sie nur Dateien aus den Download-Ordnern, nicht jedoch aus Unterordnern:

Wenn Sie alle Dateien aus dem Download-Ordner verschieben möchten, jedoch keine Dateien in Ordnern im Download-Ordner, verwenden Sie diesen Befehl:

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

Hier gibt die -maxdepthOption an, wie tief der Suchvorgang ausgeführt werden soll. Dies 1bedeutet, dass nur das im Befehl find angegebene Verzeichnis verwendet wird. Sie können versuchen 2, 3auch zu testen.

Eine ausführliche Erklärung finden Sie in der Ubuntu Find-Manpage .

Quelle

Christian Wörz
quelle
Wenn ich alle Dateien in den Ordner kopieren möchte, muss ich dann nur mv in cp ändern? Ich bin neu in Linux
Neoryder
13

Lösung

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

Der Befehl findet alle regulären Dateien unter /src/dir(einschließlich aller Unterverzeichnisse) und verschiebt sie /dst/dirmithilfe des Befehls nach mv. Ersetzen Sie einfach die Verzeichnisse durch Ihre. Dateien mit demselben Namen werden automatisch umbenannt.

Dateien zum Verschieben auswählen

Wenn Sie nur MP3-Dateien verschieben möchten, fügen Sie -iname "*.mp3"dem findBefehl anschließend eine Option hinzu -type f.

Vergleich zur Antwort von c0dev

Nur der zweite Befehl in der Antwort von c0dev beantwortet die Frage. Nachfolgend sehen Sie, wie es mit dieser Antwort verglichen wird. Die Punkte 3. und 4. können in der anderen Antwort auf die gleiche Weise wie hier gelöst werden.

  1. Mit Ausnahme mvder Lösung mit -exec +muss kein zusätzlicher Befehl wie xargsoder aufgerufen parallelund die Dateinamen zweimal übergeben werden.
  2. Die andere Antwort überschreibt unbemerkt Dateien mit demselben Namen. Hier werden die Dateien dank der Option automatisch umbenannt --backup=numbered. Leider werden diese Backups mit dem Suffix "Gefällt ~3~mir" in den meisten Dateiverwaltungen standardmäßig ausgeblendet. Leider mvlässt sich das Suffix nicht ändern, kann aber durch zusätzliche Befehle leicht nachbearbeitet werden. Dies ist eine GNU-Erweiterung.
  3. Im Gegensatz zu -print0 -exec command {} +ist dies Teil der Standards IEEE Std 1003.1 (POSIX), ISO / IEC 9945 und The Single UNIX Specification. Somit sollte es portabler sein. Siehe IEEE Std 1003.1, Ausgabe 2004 , IEEE Std 1003.1, Ausgabe 2013 und 0000243: Fügen Sie -print0 zu "find" hinzu . Der erforderliche -tSwitch von mvist jedoch eine GNU-Erweiterung, sodass der gesamte Befehl nicht zwischen POSIX-Systemen portierbar ist.

Hinweis: Im Fall der findLage wäre , Wege zu produzieren , beginnend mit -(ich weiß nicht , von einer solchen Umsetzung findim Moment.) Die {}von der End-of-Optionen Anzeige vorangestellt werden sollte: --.

Pabouk
quelle
Fehler: find: fehlendes Argument für -exec
Chris
@ Chris: Du hast recht, das {}muss wohl das letzte Argument sein. Korrigiert
Pabouk
@ Chris: Funktioniert es jetzt so, wie du es dir gewünscht hast? Wenn ja, können Sie die Antwort wahrscheinlich akzeptieren, sodass Ihre Frage nicht als "nicht gelöst" angezeigt wird.
Pabouk
Ich führe Folgendes aus und erhalte Verzeichnis-nicht-gefundene Fehler:
Chris
was ich laufe: clstal @ clap: ~ $ ls 1st script.R Firefox_wallpaper.png part1vidproj zotero pdf manager Desktop mozilla.pdf Bilder Dokumente parent Videos clstal @ clap: ~ $ find / source / directory -type f -exec mv -t / destination / directory {} + find: `/ source / directory ': Keine solche Datei oder Verzeichnis
Chris
2

Leider habe ich nicht genug Ansehen, um die markierte Lösung zu kommentieren. Ich wollte jedoch andere wegen eines Problems warnen, auf das ich gestoßen bin. Es ist ziemlich amateurhaft; Wenn Sie jedoch mehrere Dinge tun, fällt Ihnen dies zunächst möglicherweise nicht ein. Hoffentlich wird es anderen helfen.

Problem

Nach dem Einleiten des Befehls wurden Variationen der folgenden Nachricht bereitgestellt. Der Befehl erstellt dann mehrere Dateien.

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

Ursache

Das /srcist ein Elternteil von /dst(zB /src/../dst/).

Lösung

Es gibt zwar eine bessere Lösung, aber ich habe die Dateien einfach in ein temporäres Verzeichnis außerhalb von my /srcverschoben und dann den Befehl erneut ausgeführt, um sie wieder in dem /src/../dstVerzeichnis abzulegen, in dem sie landen sollen.

MackAltman
quelle
2

Mein Einzeiler - das funktioniert auf Macs, sollte aber auch auf jedem * nix funktionieren. Starten Sie vom übergeordneten Verzeichnis.

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

Der erste Teil verschiebt alles von allen Unterordnern in den eigentlichen Ordner, von dem aus Sie den Befehl gestartet haben. Der zweite Teil prüft, ob die Unterverzeichnisse leer sind (sie sollten jetzt :-) und löscht sie, damit Sie hier alles ohne Unterverzeichnisse erhalten.

X-Datei
quelle
(1) Bitte erläutern Sie, was Ihre Antwort bewirkt und welche Vorteile sie gegenüber den anderen (sehr ähnlichen) Antworten hat. Bitte antworten Sie nicht in Kommentaren; Bearbeiten Sie  Ihre Antwort, um sie klarer und vollständiger zu gestalten. (2) Beachten Sie, dass der -notOperator nicht dem Standard entspricht, sodass Ihr Befehl weniger portabel ist als die anderen.
Scott
finden . -nicht-Typ d -print0 | xargs -0J% mv -f%. ; finden . -Typ d -Tiefe -print0 | xargs -0 rm -rf Ich habe diesen Befehl in einem Ordner ausgeführt und die Unterordner und den Ordner, in dem ich mich befunden habe, gelöscht und dann in den übergeordneten Ordner verschoben. Zum Glück habe ich meinen Dateimanager beobachtet und es ist mir gelungen, den Befehl zu stoppen, und er wurde in einem Testordner ausgeführt.
Will
1

Öffnen Sie das Terminal, wechseln Sie in Ihren Ordner mit Dateien und führen Sie den Befehl aus find . -mindepth 2 -type f -print -exec mv {} . \; , um alle Dateien aus diesen Unterverzeichnissen in das aktuelle zu verschieben.

Löwe
quelle