it-swarm.com.de

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

Wie verschiebe ich Dateien und keine 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?

34
Chris

Es gibt eine großartige Antwort in der askubuntu-QA .

Ö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, aber 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 Option -maxdepth an, wie tief gesucht werden soll, 1 bedeutet nur das im Befehl find angegebene Verzeichnis. Sie können versuchen, 2, 3 auch zum Testen zu verwenden.

Eine ausführliche Erklärung finden Sie auf der Ubuntu-Hilfeseite find .

Quelle

44
Christian Wörz

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 mit dem Befehl mv in den /dst/dir. 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 dem Befehl find nach -iname "*.mp3" die Option -type f hinzu.

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 von mv muss die Lösung mit -exec + keinen zusätzlichen Befehl wie xargs oder parallel aufrufen und die Dateinamen zweimal übergeben.
  2. Die andere Antwort überschreibt stillschweigend Dateien mit demselben Namen. Hier werden die Dateien dank der Option --backup=numbered automatisch umbenannt. Leider werden diese Backups mit einem Suffix wie ~3~ in den meisten Dateiverwaltungen standardmäßig ausgeblendet. Leider erlaubt mv keine Änderung des Suffixes, kann aber durch zusätzliche Befehle leicht nachbearbeitet werden. Dies ist eine GNU Erweiterung.
  3. Im Gegensatz zu -print0 ist -exec command {} + 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 -t-Schalter von mv ist jedoch eine GNU -Erweiterung, sodass der gesamte Befehl nicht zwischen POSIX-Systemen portierbar ist.

Hinweis: In dem Fall, dass find Pfade erzeugen kann, die mit - beginnen (eine solche Implementierung von find ist mir derzeit nicht bekannt), sollte dem {} das Optionsende-Kennzeichen vorangestellt werden: --.

12
pabouk

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

Der /src ist ein übergeordnetes Element des /dst (z. B. /src/../dst/).

Lösung

Es gibt zwar eine bessere Lösung, aber ich habe die Dateien einfach in ein temporäres Verzeichnis außerhalb meines /src verschoben und dann den Befehl erneut ausgeführt, um sie wieder in das /src/../dst-Verzeichnis zu verschieben, in dem sie enden sollen.

2
MackAltman

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

1
lion

Mein Einzeiler - das funktioniert auf Macs, sollte aber auch auf jedem * nix funktionieren. Beginnen Sie mit dem ü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 aus allen Unterordnern in den eigentlichen Ordner, aus dem 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.

1
X-File