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