Hoe vind en kopieer je bestanden recursief naar één enkele map in Linux?

Gepubliceerd 14 juli 2024

Probleem: Bestanden Lokaliseren en Kopiëren Tussen Directories in Linux

Het vinden van specifieke bestanden in meerdere directories in Linux kan moeilijk zijn. Het kopiëren van deze bestanden naar één locatie voegt complexiteit toe, vooral bij geneste mapstructuren.

De Linux Oplossing: De Find en Copy Commando's Gebruiken

Het 'find' Commando Gebruiken

Het 'find' commando in Linux helpt bij het lokaliseren van bestanden en directories. De basis syntax is:

find [pad] [opties] [expressie]

Waarbij:

  • [pad] de directory is waarin gezocht wordt
  • [opties] het zoekgedrag aanpassen
  • [expressie] de zoekcriteria instelt

Je kunt zoeken naar bestanden op basis van:

  • Naam: Gebruik '-name' met het bestandsnaampatroon
  • Type: Gebruik '-type' met 'f' voor bestanden of 'd' voor directories
  • Grootte: Gebruik '-size' met de bestandsgrootte
  • Wijzigingstijd: Gebruik '-mtime' met het aantal dagen

Om bijvoorbeeld alle .txt bestanden in de huidige directory en zijn subdirectories te vinden:

find . -name "*.txt"

Tip: Directories Uitsluiten van Zoekopdracht

Om specifieke directories uit te sluiten van je zoekopdracht, gebruik de '-not' en '-path' opties. Om bijvoorbeeld alle .txt bestanden te vinden maar de 'temp' directory uit te sluiten:

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

'find' Combineren met 'cp' voor Kopiëren

Het doorsturen van commando's laat je de output van één commando gebruiken als input voor een ander. Door 'find' te combineren met 'cp', kun je bestanden in één stap lokaliseren en kopiëren.

Om 'find' en 'cp' samen te gebruiken, gebruik de '-exec' optie met 'find':

find [pad] [criteria] -exec cp {} [bestemming] \;

Om bijvoorbeeld alle .jpg bestanden te vinden en te kopiëren naar een 'pictures' map:

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

Dit commando zoekt naar .jpg bestanden in de huidige directory en zijn subdirectories, en kopieert vervolgens elk bestand naar de 'pictures' map in de home directory.

Stap-voor-Stap Gids om Bestanden Recursief te Vinden en Kopiëren

De Zoekparameters Instellen

Om te beginnen met zoeken naar bestanden, definieer de zoekdirectory. Dit kan een specifiek pad zijn of de huidige directory ('.').

Om te zoeken in de /home/user/documents directory:

find /home/user/documents

Stel vervolgens de bestandsmatchingcriteria in. Veelvoorkomende criteria zijn:

  • Naam: Gebruik '-name' met het bestandsnaampatroon tussen aanhalingstekens
  • Type: Gebruik '-type' met 'f' voor bestanden of 'd' voor directories
  • Grootte: Gebruik '-size' met '+' voor groter dan of '-' voor kleiner dan, gevolgd door de grootte ('c' voor bytes, 'k' voor kilobytes, 'M' voor megabytes)

Om alle PDF bestanden groter dan 1MB te vinden:

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

De Kopieeroperatie Uitvoeren

Om bestanden gevonden door het 'find' commando te kopiëren, gebruik de '-exec' optie met het 'cp' commando. De basisstructuur is:

find [zoek_directory] [criteria] -exec cp {} [bestemming_directory] \;

'{}' vertegenwoordigt elk bestand gevonden door 'find'.

Om alle .jpg bestanden van /home/user/pictures naar /backup/images te kopiëren terwijl de originele directorystructuur behouden blijft, gebruik:

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

De '--parents' optie met 'cp' behoudt de directorystructuur. Dit helpt bij het organiseren van bestanden en voorkomt naamconflicten in de bestemmingsdirectory.

Tip: Gebruik '-print0' voor Bestandsnamen met Spaties

Als je bestandsnamen mogelijk spaties bevatten, gebruik de '-print0' optie met 'find' en de '-0' optie met 'xargs':

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

Dit behandelt bestandsnamen met spaties correct.

Example: Specifieke Directories Uitsluiten

Om bepaalde directories uit te sluiten van je zoekopdracht, gebruik de '-not' en '-path' opties:

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

Dit commando kopieert alle .txt bestanden van /home/user/documents naar /backup/texts, met uitzondering van bestanden in directories genaamd 'tmp'.

Aanvullende Overwegingen voor Bestandsoperaties

Omgaan met Permissies en Eigenaarschap

Bij het kopiëren van bestanden kun je permissieproblemen tegenkomen. Deze kunnen optreden als je geen toegang hebt om de bronbestanden te lezen of naar de bestemmingsdirectory te schrijven. Om deze problemen te voorkomen, moet je mogelijk het kopieercommando uitvoeren met sudo privileges.

Om de originele bestandsattributen te behouden, gebruik de '-p' optie met het 'cp' commando. Hier is een voorbeeld:

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

Dit commando kopieert alle .txt bestanden van de brondirectory naar de bestemmingsdirectory, waarbij hun originele permissies en eigenaarschap behouden blijven.

Voor meer controle over permissies, gebruik de '--preserve' optie met 'cp':

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

Dit commando behoudt de bestandsmodus, eigenaarschap en tijdstempels van de originele bestanden.

Omgaan met Dubbele Bestandsnamen

Bij het kopiëren van bestanden naar een nieuwe locatie kun je bestanden met dezelfde namen tegenkomen. Standaard zal het 'cp' commando bestaande bestanden in de bestemmingsdirectory overschrijven.

Om het overschrijven van bestanden te voorkomen, gebruik de '-n' optie met 'cp':

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

Dit commando zal bestaande bestanden in de bestemmingsdirectory niet overschrijven.

Een andere methode is om een achtervoegsel toe te voegen aan gekopieerde bestanden. Gebruik de '--backup' optie met 'cp':

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

Dit commando voegt een nummer toe aan het einde van eventuele dubbele bestandsnamen in de bestemmingsdirectory.

Je kunt ook het 'rsync' commando gebruiken in plaats van 'cp' voor meer controle over het kopiëren van bestanden:

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

Dit commando gebruikt 'rsync' om bestanden te kopiëren, wat duplicaten flexibeler kan afhandelen en opties biedt voor het alleen bijwerken van gewijzigde bestanden.

Tip: Gebruik 'cpio' voor Complexe Kopieeroperaties

Voor complexe kopieeroperaties, overweeg het gebruik van het 'cpio' commando:

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

Dit commando gebruikt 'cpio' om bestanden te kopiëren, wat grote aantallen bestanden efficiënter kan verwerken dan 'cp'.