Linux begonnen
This commit is contained in:
@@ -0,0 +1,337 @@
|
||||
# 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 <befehl>
|
||||
```
|
||||
|
||||
### Moderne Alternative
|
||||
|
||||
Wenn möglich:
|
||||
|
||||
```bash
|
||||
find . -exec <befehl> {} +
|
||||
```
|
||||
|
||||
Diese Variante ist oft einfacher und ebenso effizient.
|
||||
Reference in New Issue
Block a user