# Linux: Projekte ablegen, Dateien suchen/löschen und `xargs` ## Projekte unter Linux organisieren Es gibt keine feste Vorgabe, aber einige Verzeichnisstrukturen haben sich etabliert. ### Für persönliche Entwicklungsprojekte Empfohlen: - `~/Projects/` - `~/Code/` - `~/src/` (unter Entwicklern sehr verbreitet) Beispiel: ```text /home/max/ ├── Documents/ ├── Downloads/ ├── Projects/ │ ├── website/ │ ├── python-tool/ │ └── homelab/ ``` Oder eine nach Git-Hosting strukturierte Variante: ```text ~/src/ ├── github.com/ │ └── benutzer/ │ ├── projekt1/ │ └── projekt2/ └── private/ ``` Verzeichnis anlegen: ```bash mkdir -p ~/Projects ``` oder ```bash mkdir -p ~/src ``` ### Für mehrere Benutzer | Verzeichnis | Zweck | |-------------|-------| | `/srv/` | Gemeinsam genutzte Projekte oder Dienste | | `/usr/local/src/` | Systemweiter Quellcode | | `/opt/` | Installierte Drittanbieter-Software (nicht für eigenen Quellcode) | --- # Dateien mit `find` suchen und löschen ## Dateien nach Namen löschen Alle `.tmp`-Dateien löschen: ```bash find . -name "*.tmp" -delete ``` --- ## Erst suchen, dann löschen (empfohlen) Dateien anzeigen: ```bash find . -name "*.tmp" ``` Anschließend löschen: ```bash find . -name "*.tmp" -delete ``` --- ## Mit Rückfrage löschen ```bash find . -name "*.tmp" -ok rm {} \; ``` oder ```bash find . -name "*.tmp" -exec rm -i {} \; ``` --- ## Nach Alter löschen Logdateien, die älter als 30 Tage sind: ```bash find . -name "*.log" -mtime +30 -delete ``` --- ## Leere Verzeichnisse löschen ```bash find . -type d -empty -delete ``` --- ## Achtung `-delete` löscht Dateien sofort und ohne Papierkorb. Deshalb empfiehlt sich immer: 1. `find` ohne `-delete` 2. Ergebnisse prüfen 3. `-delete` ergänzen Beispiel: ```bash find ~/Downloads -name "*.zip" find ~/Downloads -name "*.zip" -delete ``` --- # `xargs` erklärt ## Was macht `xargs`? `xargs` nimmt Eingaben (meist aus einer Pipe) entgegen und macht daraus Argumente für einen anderen Befehl. Beispiel: ```bash echo "a.txt b.txt c.txt" | xargs rm ``` Das entspricht: ```bash rm a.txt b.txt c.txt ``` --- ## Typischer Einsatz mit `find` Ohne `xargs`: ```bash find . -name "*.log" -exec rm {} \; ``` Mit `xargs`: ```bash find . -name "*.log" | xargs rm ``` `xargs` bündelt mehrere Dateinamen zu einem einzigen `rm`-Aufruf und ist dadurch oft effizienter. --- ## Problem mit Leerzeichen Angenommen, es gibt eine Datei: ```text Meine Datei.txt ``` Dann liefert: ```bash find . -name "*.txt" | xargs rm ``` `xargs` trennt standardmäßig an Leerzeichen und Zeilenumbrüchen. Es interpretiert: ```text ./Meine Datei.txt ``` als zwei Argumente: - `./Meine` - `Datei.txt` Das führt zu Fehlern. --- ## Die sichere Lösung Deshalb verwendet man fast immer: ```bash find . -name "*.txt" -print0 | xargs -0 rm ``` ### Warum? - `find -print0` trennt Dateinamen mit einem Nullbyte (`\0`) - `xargs -0` liest genau dieses Format Dadurch funktionieren auch Dateinamen mit: - Leerzeichen - Tabs - Zeilenumbrüchen - Sonderzeichen --- ## Platzhalter mit `-I` Soll der Dateiname mitten im Befehl stehen: ```bash find . -name "*.jpg" | xargs -I {} cp {} /backup/ ``` Für jede Datei wird ausgeführt: ```bash cp datei.jpg /backup/ ``` --- ## Anzahl der Argumente begrenzen ```bash seq 1 10 | xargs -n 3 echo ``` Ausgabe: ```text 1 2 3 4 5 6 7 8 9 10 ``` `-n 3` bedeutet: maximal drei Argumente pro Befehlsaufruf. --- ## Parallelisierung Mehrere Prozesse gleichzeitig starten: ```bash find . -name "*.png" | xargs -P 4 -n 1 convert ``` Parameter: - `-P 4` → bis zu vier Prozesse parallel - `-n 1` → ein Dateiname pro Prozess --- ## Alternative ohne `xargs` Viele moderne Befehle unterstützen bereits mehrere Dateien gleichzeitig. Beispiel: ```bash find . -name "*.log" -exec rm {} + ``` Das erreicht nahezu denselben Effekt wie: ```bash find . -name "*.log" -print0 | xargs -0 rm ``` --- # Merksätze ### Projekte - Eigene Projekte → `~/Projects` oder `~/src` - Gemeinsame Projekte → `/srv` - Installierte Software → `/opt` ### `find` - Dateien suchen: ```bash find . -name "*.txt" ``` - Direkt löschen: ```bash find . -name "*.txt" -delete ``` ### `xargs` - Macht aus Pipe-Ausgabe Befehlsargumente. - Spart viele einzelne Programmaufrufe. - Immer sicher verwenden mit: ```bash find . -print0 | xargs -0 ``` ### Moderne Alternative Wenn möglich: ```bash find . -exec {} + ``` Diese Variante ist oft einfacher und ebenso effizient.