Wie verschiebe ich mehrere Dateien aus verschiedenen Verzeichnissen in ein einziges Verzeichnis?

Wie verschiebe ich mehrere Dateien aus verschiedenen Verzeichnissen in ein einziges Verzeichnis?

Ich habe 220 Verzeichnisse, jedes mit 2 Dateien darin. Alle Dateien haben die gleiche Endung (*.fq.gz). Ich möchte alle diese Dateien in ein einziges Verzeichnis verschieben.

Ich denke, ich könnte das mit einer Shell-Schleife machen, aber ich habe keine Ahnung, wie das geht ...

Antwort1

Das ist etwas, das ich benutze, wenn ich nicht besonders vorsichtig sein muss

mkdir unique_dir && mv */*.fq.gz unique_dir/

Sofern ich nichts übersehen habe.

Antwort2

Sie haben Recht. Sie können diese Aufgabe mit zwei For-Schleifen erledigen. Eine innerhalb der anderen. Wir werden ein Bash-Skript erstellen, das genau das tut. Sehen wir uns an, wie es aussehen würde:

#!/bin/bash

for dir in */; do
  echo "$dir"
  cd "$dir"
  for file in *; do
    echo "moving $file" 
    mv $file ~/targetdir    
  done
  cd ..
done

Wenn Sie ein schnelleres Skript haben möchten, entfernen Sie einfach das Echo aus dem Skript. Ich habe dies gemacht, um die Verfolgung des Fortschritts zu vereinfachen.

Erstellen Sie einfach eine Datei und kopieren Sie diese Befehle hinein. Geben Sie ihr anschließend die Ausführungsberechtigung chmod +x scriptfileund führen Sie sie ./scriptfileim Hauptverzeichnis aus, in dem sich die anderen Verzeichnisse befinden. Vergessen Sie nicht, targetdir und scriptfile durch Ihr Zielverzeichnis und den Namen der Skriptdatei zu ersetzen.

Wenn Ihre Verzeichnisse mehrere Dateien enthalten, ersetzen Sie sie in der Schleife einfach *durch , und es werden nur Ihre beiden Dateien durchlaufen.*.fq.gzfor file

Achtung!!! Erstellen Sie Ihr Zielverzeichnis nicht im Hauptverzeichnis, da es auch darin iteriert.


Bearbeiten: Wie @steeldriver vorgeschlagen hat, könnten Sie for dirBefehle entfernen und einfach for fileBefehle verwenden */*.fq.gz, um eine schnellere Schleife zu erhalten. Ich habe beschlossen, sie beizubehalten, um besser verfolgen zu können, was in Verzeichnissen vor sich geht.

Bearbeiten: Während ich auf Manpages und Webseiten zu den von @waltinator beantworteten Find- und Xarg-Befehlen recherchierte, fand ich, dass es bequemer, schneller und sicherer ist. Ich habe sogar eine Alternative zu Xarg gefunden, indem ich die Option -exec des Find-Befehls verwende, wie z . B. find . -type f -name '*.fq.gz' -exec mv --backup=numbered --target-directory=$dest {} \;.

Antwort3

Wenn Sie mit vielen Dateien oder Dateien mit komischen Namen arbeiten, sind finddies xargsdie zu verwendenden Tools. Lesen Sie man find;man xargsund führen Sie etwas aus wie:

dest=../destination # must be outside this directory tree
mkdir $dest

find . -type f -name '*.fq.gz' -print0 |\
   xargs -0 --no-run-if-empty echo mv --backup=numbered --target-directory=$dest

Wenn Sie mit den Ergebnissen zufrieden sind, ersetzen Sie " echo mv" durch einfach " mv".

$destUm die Schwierigkeit „ist im aktuellen Verzeichnis“ auszuschließen , verwenden Sie --prune:

find . -type d -name "$dest" -prune -o -type f -name '*.fq.gz' -print0 |\
   xargs -0 --no-run-if-empty echo mv --backup=numbered --target-directory=$dest

Antwort4

krusader can search files and save to a custom tab then you can select all of those (or filter the list) and move them to the destination

sudo apt install krusader

Sie können auch hinzufügen

sudo apt install krename

Gehen Sie zum obersten Quellverzeichnis, zu den Tools, zur Suche oder mit Strg+S. Klicken Sie auf Feed, um die Listbox zu bearbeiten. Wählen Sie alle Dateien aus und kopieren Sie sie in ein anderes Fenster oder drücken Sie F5. Das andere Fenster ist die andere Registerkarte, die das Quellziel ist.

verwandte Informationen