Ich habe ein Verzeichnis mit vielen Dateien, etwa 50.000 PDFs und anderen Dateien auf einem Server. Ich muss bestimmte in ein anderes Verzeichnis verschieben. Ich kann eine Liste der Dateien erstellen, die entweder in csv oder einem anderen Textformat verschoben werden müssen.
Ich muss lediglich ein Bash-Skript ausführen und die in der Textdatei aufgelisteten Dateien in ein anderes Verzeichnis verschieben oder kopieren.
Gibt es eine einfache Möglichkeit, dies zu tun? Anregungen oder Ressourcen wäre sehr dankbar.
Antworten:
rsync hat mehrere Optionen , die eine Liste von Dateien zu verarbeiten nehmen können (
--files-from
,--include-from
usw.).Zum Beispiel wird dies den Trick machen:
quelle
rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
Um eine nutzlose Verwendung von
cat
(und wenn Sie nicht verwendenrsync
) zu vermeiden :Dies behandelt jeden gültigen Dateinamen, es sei denn, er enthält eine neue Zeile, wenn die Dateien in einer Zeile aufgelistet sind.
quelle
mv
alle in dasselbe Zielverzeichnis reduziert. Derrsync
Ansatz in der akzeptierten Antwort leidet nicht unter dieser Einschränkung.vorausgesetzt, Bash plus
listoffiles
eine Datei pro Zeile. Mein einziger Einwand gegen die Rsync-Route ist, dass das OP nach einer Methode zum Verschieben der Dateien fragt, nicht zum Kopieren. rsync hat mehr Flags als eine königliche Hochzeit, daher bin ich mir sicher, dass es weiter modifiziert werden kann, aber manchmal ist einfacher besser!quelle
while read -r file; do mv "$file" /path/of/destination ; done < listoffiles
Dies hängt vom Format der von Ihnen verwendeten Textdatei ab. Beispiel: Sie haben die Liste der Dateien so geschrieben, dass sich jede Datei in einer neuen Zeile befindet. Sie können Xargs wie folgt verwenden:
Sie können auch den
find
Befehl mit der-exec
Option verwenden. Dateien kopieren / verschieben.quelle
Rsync bietet gegenüber den Befehlen
cp
oder den zusätzlichen Vorteil,mv
dass Ordner automatisch erstellt werden, wenn sie nicht vorhanden sind.quelle
/path/to/source
benötigt, wenn die Pfade aus der Dateiliste übernommen werden?Ich denke, die Antwort von rsync ist besser, aber nur für eine andere Option:
quelle
Ich habe versehentlich den gesamten Inhalt eines Verzeichnisses in ein Zielverzeichnis kopiert, anstatt das gesamte Verzeichnis zu verschieben. Dies führte dazu, dass ein überfülltes Zielverzeichnis anstelle des Ursprungsverzeichnisses zum Verzeichnis hinzugefügt wurde.
Um dies zu beheben, habe ich Folgendes getan:
ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove
Mit dem obigen Befehl wird die Datei filestomove erstellt, die eine Liste aller Inhalte des Zielverzeichnisses enthält, und zwar in umgekehrter Reihenfolge nach der Zeit, dh vom ältesten zum neuesten.Dann habe ich ein Unterverzeichnis des jetzt überfüllten Zielverzeichnisses erstellt, in das das Zeug verschoben werden soll.
mkdir /path/to/cluttered/destination/directory/newsubdirectory
Dann wiederholte ich die Verzeichnisliste, mit Ausnahme der Auflistung auf dem Bildschirm und der Anzeige weiterer Details.
ls -lrht /path/to/cluttered/destination/directory/
Diese Zeile listet das Verzeichnis auf, sortiert nach aufsteigendem Datum (umgekehrte Sortierung nach Uhrzeit), und zeigt weitere Informationen an, einschließlich des Datums- / Zeitstempels jeder Datei im jetzt überfüllten Zielverzeichnis. Ich beziehe mich darauf und beginne oben, um zu zeigen, welche Verzeichnisse und Dateien ich dort behalten möchte, wo sie waren. Es wird eine Lücke im Datums- / Zeitstempel der Dateien geben, in der alle neuen Dateien beginnen, die nicht vorhanden sein sollten.Dann habe ich die im ersten Schritt oben erstellte Datei filestomove bearbeitet (die nach Datum sortiert ist) und die wenigen Dateien aus der Liste gelöscht, die zuvor dort vorhanden waren und die ich aus dem ursprünglichen Verzeichnis behalten möchte.
vim /opt/dircheck/filestomove
Löschen Sie von oben alle Dateien, die Sie nicht verschieben möchten.Dann habe ich den zuvor in diesem Beitrag aufgeführten Befehl verwendet, um die Dateien in meiner Liste in das neue Verzeichnis zu verschieben, das ich erstellt habe.
sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory
Dadurch wurden alle Dateien im Bruchteil einer Sekunde verschoben. (Hinweis: Möglicherweise benötigen Sie das sudo am Anfang nicht. Dies ist eine Frage der Dateiberechtigungen.)
Jetzt ist mein ursprüngliches Zielverzeichnis schön sauber und enthält ein neues Verzeichnis mit allen Dateien und Verzeichnissen, die es überfüllt haben.
quelle
Wenn (und nur wenn), haben Sie keine unangenehmen Zeichen in den Dateinamen (Leerzeichen, Zeilenumbrüche, die xargs verwirren würden, wie Dinge in einzelne Argumente aufgeteilt werden), und Sie generieren eine Liste von Dateien, die durch Zeilenumbrüche voneinander getrennt sind (eine Datei) pro zeile) könnte man sowas machen.
(Im Allgemeinen, siehe man xargs , es ist super)
Wenn Ihr bestimmter MV nicht die Option -t hat, können Sie auch einige Tricks wie ausführen
Hinweis - Keiner dieser Befehle funktioniert wie erwartet, wenn Dateinamen mit Zeilenumbrüchen enthalten sind.
quelle
cp
,mv
und dergleichen haben keine-t
Option auf bsd 's, und das zweite Beispiel mit Subshell hat bei mir nicht funktioniert (/path/to/move
wird als letzter Dateiname angehängt)(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
Versuchen Sie etwas wie:
quelle
while read line; do mv $line /images; done < list.txt
als ein einziger Befehl gewesen seinDas Folgende funktionierte für mich, als ich alle PNG-Dateien von einem bestimmten Pfad (und allen Unterverzeichnissen) an einen neuen Speicherort kopieren musste, während die Verzeichnisstruktur beibehalten wurde:
Da RSYNC zuerst den Spiegel der Verzeichnisstruktur erstellt und dann die Dateien synchronisiert, können Sie überschüssige Ordner finden, die leer sind. Ich habe das Flag --prune-empty-dirs verwendet, um diese leeren Verzeichnisse zu entfernen.
Ich habe keine Zugehörigkeit, hielt es aber für richtig, der Quelle, die diese Lösung inspiriert hat, Anerkennung zu zollen : http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/
quelle