Wie findet und kopiert man Dateien rekursiv in ein einzelnes Verzeichnis in Linux?

Veröffentlicht 8. September 2024

Problem: Dateien in mehreren Verzeichnissen unter Linux finden und kopieren

Das Auffinden bestimmter Dateien in mehreren Verzeichnissen unter Linux kann schwierig sein. Das Kopieren dieser Dateien an einen Ort erhöht die Komplexität, besonders bei verschachtelten Ordnerstrukturen.

Die Linux-Lösung: Verwendung von Find- und Kopierbefehlen

Verwendung des 'find'-Befehls

Der 'find'-Befehl in Linux hilft beim Auffinden von Dateien und Verzeichnissen. Seine grundlegende Syntax lautet:

find [Pfad] [Optionen] [Ausdruck]

Wobei:

  • [Pfad] das zu durchsuchende Verzeichnis ist
  • [Optionen] das Suchverhalten ändern
  • [Ausdruck] die Suchkriterien festlegt

Sie können nach Dateien suchen basierend auf:

  • Name: Verwenden Sie '-name' mit dem Dateinamen-Muster
  • Typ: Verwenden Sie '-type' mit 'f' für Dateien oder 'd' für Verzeichnisse
  • Größe: Verwenden Sie '-size' mit der Dateigröße
  • Änderungszeit: Verwenden Sie '-mtime' mit der Anzahl der Tage

Um beispielsweise alle .txt-Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen zu finden:

find . -name "*.txt"

Tipp: Verzeichnisse von der Suche ausschließen

Um bestimmte Verzeichnisse von Ihrer Suche auszuschließen, verwenden Sie die Optionen '-not' und '-path'. Um beispielsweise alle .txt-Dateien zu finden, aber das 'temp'-Verzeichnis auszuschließen:

find . -name "*.txt" -not -path "./temp/*"

Kombination von 'find' mit 'cp' zum Kopieren

Durch Piping von Befehlen können Sie die Ausgabe eines Befehls als Eingabe für einen anderen verwenden. Durch die Kombination von 'find' mit 'cp' können Sie Dateien in einem Schritt finden und kopieren.

Um 'find' und 'cp' zusammen zu verwenden, nutzen Sie die Option '-exec' mit 'find':

find [Pfad] [Kriterien] -exec cp {} [Ziel] \;

Um beispielsweise alle .jpg-Dateien zu finden und in einen 'pictures'-Ordner zu kopieren:

find . -name "*.jpg" -exec cp {} ~/pictures \;

Dieser Befehl sucht nach .jpg-Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen und kopiert dann jede Datei in den 'pictures'-Ordner im Home-Verzeichnis.

Schritt-für-Schritt-Anleitung zum Finden und Kopieren von Dateien rekursiv

Festlegen der Suchparameter

Um mit der Suche nach Dateien zu beginnen, definieren Sie das Suchverzeichnis. Dies kann ein spezifischer Pfad oder das aktuelle Verzeichnis ('.') sein.

Um im Verzeichnis /home/user/documents zu suchen:

find /home/user/documents

Legen Sie als Nächstes die Datei-Übereinstimmungskriterien fest. Häufige Kriterien sind:

  • Name: Verwenden Sie '-name' mit dem Dateinamen-Muster in Anführungszeichen
  • Typ: Verwenden Sie '-type' mit 'f' für Dateien oder 'd' für Verzeichnisse
  • Größe: Verwenden Sie '-size' mit '+' für größer als oder '-' für kleiner als, gefolgt von der Größe ('c' für Bytes, 'k' für Kilobytes, 'M' für Megabytes)

Um alle PDF-Dateien größer als 1MB zu finden:

find /home/user/documents -name "*.pdf" -type f -size +1M

Ausführen des Kopiervorgangs

Um die vom 'find'-Befehl gefundenen Dateien zu kopieren, verwenden Sie die Option '-exec' mit dem 'cp'-Befehl. Die grundlegende Struktur lautet:

find [Suchverzeichnis] [Kriterien] -exec cp {} [Zielverzeichnis] \;

'{}' repräsentiert jede von 'find' gefundene Datei.

Um alle .jpg-Dateien von /home/user/pictures nach /backup/images zu kopieren und dabei die ursprüngliche Verzeichnisstruktur beizubehalten, verwenden Sie:

find /home/user/pictures -name "*.jpg" -exec cp --parents {} /backup/images \;

Die Option '--parents' mit 'cp' behält die Verzeichnisstruktur bei. Dies hilft bei der Organisation der Dateien und vermeidet Namenskonflikte im Zielverzeichnis.

Tipp: Verwenden Sie '-print0' für Dateinamen mit Leerzeichen

Wenn Ihre Dateinamen Leerzeichen enthalten könnten, verwenden Sie die Option '-print0' mit 'find' und die Option '-0' mit 'xargs':

find /home/user/pictures -name "*.jpg" -print0 | xargs -0 cp -t /backup/images

Dies behandelt Dateinamen mit Leerzeichen korrekt.

Beispiel: Bestimmte Verzeichnisse ausschließen

Um bestimmte Verzeichnisse von Ihrer Suche auszuschließen, verwenden Sie die Optionen '-not' und '-path':

find /home/user/documents -name "*.txt" -not -path "*/tmp/*" -exec cp {} /backup/texts \;

Dieser Befehl kopiert alle .txt-Dateien von /home/user/documents nach /backup/texts und schließt dabei alle Dateien in Verzeichnissen namens 'tmp' aus.

Weitere Überlegungen zu Dateioperationen

Umgang mit Berechtigungen und Eigentum

Beim Kopieren von Dateien können Berechtigungsprobleme auftreten. Diese können auftreten, wenn Sie keine Leseberechtigung für die Quelldateien oder keine Schreibberechtigung für das Zielverzeichnis haben. Um diese Probleme zu vermeiden, müssen Sie möglicherweise den Kopierbefehl mit sudo-Rechten ausführen.

Um die ursprünglichen Dateiattribute beizubehalten, verwenden Sie die Option '-p' mit dem 'cp'-Befehl. Hier ein Beispiel:

find /source/directory -name "*.txt" -exec cp -p {} /destination/directory \;

Dieser Befehl kopiert alle .txt-Dateien vom Quellverzeichnis in das Zielverzeichnis und behält dabei ihre ursprünglichen Berechtigungen und Eigentumsverhältnisse bei.

Für mehr Kontrolle über die Berechtigungen verwenden Sie die Option '--preserve' mit 'cp':

find /source/directory -name "*.txt" -exec cp --preserve=mode,ownership,timestamps {} /destination/directory \;

Dieser Befehl behält den Dateimodus, das Eigentum und die Zeitstempel der Originaldateien bei.

Umgang mit doppelten Dateinamen

Beim Kopieren von Dateien an einen neuen Ort können Sie auf Dateien mit denselben Namen stoßen. Standardmäßig überschreibt der 'cp'-Befehl bestehende Dateien im Zielverzeichnis.

Um das Überschreiben von Dateien zu vermeiden, verwenden Sie die Option '-n' mit 'cp':

find /source/directory -name "*.txt" -exec cp -n {} /destination/directory \;

Dieser Befehl überschreibt keine bestehenden Dateien im Zielverzeichnis.

Eine andere Methode besteht darin, kopierten Dateien ein Suffix hinzuzufügen. Verwenden Sie die Option '--backup' mit 'cp':

find /source/directory -name "*.txt" -exec cp --backup=numbered {} /destination/directory \;

Dieser Befehl fügt doppelten Dateinamen im Zielverzeichnis eine Nummer am Ende hinzu.

Sie können auch den 'rsync'-Befehl anstelle von 'cp' verwenden, um mehr Kontrolle über das Kopieren von Dateien zu haben:

find /source/directory -name "*.txt" -print0 | rsync -av --files-from=- --from0 /source/directory /destination/directory

Dieser Befehl verwendet 'rsync' zum Kopieren von Dateien, was Duplikate flexibler handhaben kann und Optionen zum Aktualisieren nur geänderter Dateien bietet.

Tipp: Verwenden Sie 'cpio' für komplexe Kopieroperationen

Für komplexe Kopieroperationen sollten Sie den 'cpio'-Befehl in Betracht ziehen:

find /source/directory -name "*.txt" -print0 | cpio -pmd0 /destination/directory

Dieser Befehl verwendet 'cpio' zum Kopieren von Dateien, was große Mengen von Dateien effizienter handhaben kann als 'cp'.