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'.





