it-swarm.com.de

Linux (mv oder cp) spezifische Dateien aus einer Textliste von Dateien?

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 aufgeführten Dateien in ein anderes Verzeichnis verschieben oder kopieren.

Gibt es eine einfache Möglichkeit, dies zu tun? Anregungen oder Ressourcen wäre sehr dankbar.

36
Jestep

rsync verfügt über mehrere Optionen, mit denen eine Liste der zu verarbeitenden Dateien erstellt werden kann (--files-from, --include-from, usw.).

Dies reicht beispielsweise aus:

rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory

Um eine nutzlose Verwendung von cat zu vermeiden (und wenn Sie rsync nicht verwenden):

xargs -a file_list.txt mv -t /path/to/dest

Dies behandelt jeden gültigen Dateinamen, es sei denn, er enthält eine neue Zeile, wenn die Dateien eine pro Zeile aufgeführt sind.

for file in `cat listoffiles`; do mv "$file" /path/of/destination ; done

angenommen, Bash plus listoffiles enthält 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 Flaggen als eine königliche Hochzeit, daher bin ich sicher, dass es dafür weiter modifiziert werden kann, aber manchmal ist einfacher besser!

15
MadHatter
rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/

Rsync hat den zusätzlichen Vorteil gegenüber den Befehlen cp oder mv, da automatisch Ordner erstellt werden, wenn diese nicht vorhanden sind.

5
Paul Wenzel

Dies hängt vom Format Ihrer Textdatei ab. Wenn Sie beispielsweise die Liste der Dateien so geschrieben haben, dass sich jede Datei in einer neuen Zeile befindet. Sie können xargs verwenden wie:

$ cat your_text_file | xargs cp -t /path/to/destination

Sie können auch den Befehl find mit der Option -exec Verwenden. um die Dateien zu kopieren/verschieben.

4
Khaled

Wenn (und nur wenn), haben Sie keine bösen Zeichen in den Dateinamen (Leerzeichen, Zeilenumbrüche, die xargs verwirren würden, wie man Dinge in einzelne Argumente aufteilt), und Sie generieren eine Liste von Dateien, die durch Zeilenumbrüche getrennt sind (eine Datei) pro Zeile) könnte man so etwas machen.

cat filenames.txt | xargs mv -t /path/to/move/files/to

(Im Allgemeinen siehe Mann xargs , es ist fantastisch)

Wenn Ihr bestimmter MV nicht die Option -t hat, können Sie auch einige Tricks ausführen

( cat filenames.txt; echo; echo /path/to/move/files/to ) | xargs mv

Hinweis - Keine dieser Funktionen funktioniert wie erwartet, wenn Dateinamen mit Zeilenumbrüchen enthalten sind.

2

Ich denke, die rsync-Antwort ist besser, aber nur für eine andere Option:

tar -cf - -T FILE_OF_FILENAMES_TO_MOVE.txt |(cd /path/to/new/dir && tar -xvf -)
2
jj33

Ich habe versehentlich den vollständigen Inhalt eines Verzeichnisses in ein Zielverzeichnis kopiert, anstatt das vollständige Verzeichnis zu verschieben. Dies führte dazu, dass ein überfülltes Zielverzeichnis anstelle des Origin-Verzeichnisses 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 darstellt, die nach Zeit umgekehrt sortiert ist und die älteste bis neueste bedeutet.

Dann habe ich ein Unterverzeichnis des jetzt überfüllten Zielverzeichnisses erstellt, in das das Material 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 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 (die nach Datum sortiert ist) bearbeitet und die wenigen aus der Liste gelöscht, die zuvor vorhanden waren und die ich aus dem ursprünglichen Verzeichnis behalten möchte.

vim /opt/dircheck/filestomove Alle Dateien, die Sie nicht verschieben möchten, von oben löschen.

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 in Sekundenbruchteilen 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 und sauber und enthält ein neues Verzeichnis mit allen Dateien und Verzeichnissen, die es überladen haben.

1
John

Versuchen Sie etwas wie:

cat list.txt | while read line; do mv "$line" /images; done
0
AliGibbs

Folgendes funktionierte für mich, wenn ich alle PNG-Dateien von einem bestimmten Pfad (und allen Unterverzeichnissen) an einen neuen Speicherort kopieren musste, wobei die Verzeichnisstruktur beibehalten wurde:

rsync -av --Prune-empty-dirs --include='*/' --include='*.png' --exclude='*' source/ destination/

Da RSYNC zuerst den Spiegel der Verzeichnisstruktur erstellt und dann die Dateien synchronisiert, kann es zu überschüssigen Ordnern kommen, die leer sind. Ich habe das Flag --Prune-empty-dirs verwendet, um diese leeren Verzeichnisse zu entfernen.

Ich habe keine Zugehörigkeit, hielt es jedoch für richtig, der Quelle, die diese Lösung inspiriert hat, Anerkennung zu schenken: http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/

0