4.6 KiB
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:
/home/max/
├── Documents/
├── Downloads/
├── Projects/
│ ├── website/
│ ├── python-tool/
│ └── homelab/
Oder eine nach Git-Hosting strukturierte Variante:
~/src/
├── github.com/
│ └── benutzer/
│ ├── projekt1/
│ └── projekt2/
└── private/
Verzeichnis anlegen:
mkdir -p ~/Projects
oder
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:
find . -name "*.tmp" -delete
Erst suchen, dann löschen (empfohlen)
Dateien anzeigen:
find . -name "*.tmp"
Anschließend löschen:
find . -name "*.tmp" -delete
Mit Rückfrage löschen
find . -name "*.tmp" -ok rm {} \;
oder
find . -name "*.tmp" -exec rm -i {} \;
Nach Alter löschen
Logdateien, die älter als 30 Tage sind:
find . -name "*.log" -mtime +30 -delete
Leere Verzeichnisse löschen
find . -type d -empty -delete
Achtung
-delete löscht Dateien sofort und ohne Papierkorb.
Deshalb empfiehlt sich immer:
findohne-delete- Ergebnisse prüfen
-deleteergänzen
Beispiel:
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:
echo "a.txt b.txt c.txt" | xargs rm
Das entspricht:
rm a.txt b.txt c.txt
Typischer Einsatz mit find
Ohne xargs:
find . -name "*.log" -exec rm {} \;
Mit xargs:
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:
Meine Datei.txt
Dann liefert:
find . -name "*.txt" | xargs rm
xargs trennt standardmäßig an Leerzeichen und Zeilenumbrüchen.
Es interpretiert:
./Meine Datei.txt
als zwei Argumente:
./MeineDatei.txt
Das führt zu Fehlern.
Die sichere Lösung
Deshalb verwendet man fast immer:
find . -name "*.txt" -print0 | xargs -0 rm
Warum?
find -print0trennt Dateinamen mit einem Nullbyte (\0)xargs -0liest genau dieses Format
Dadurch funktionieren auch Dateinamen mit:
- Leerzeichen
- Tabs
- Zeilenumbrüchen
- Sonderzeichen
Platzhalter mit -I
Soll der Dateiname mitten im Befehl stehen:
find . -name "*.jpg" | xargs -I {} cp {} /backup/
Für jede Datei wird ausgeführt:
cp datei.jpg /backup/
Anzahl der Argumente begrenzen
seq 1 10 | xargs -n 3 echo
Ausgabe:
1 2 3
4 5 6
7 8 9
10
-n 3 bedeutet: maximal drei Argumente pro Befehlsaufruf.
Parallelisierung
Mehrere Prozesse gleichzeitig starten:
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:
find . -name "*.log" -exec rm {} +
Das erreicht nahezu denselben Effekt wie:
find . -name "*.log" -print0 | xargs -0 rm
Merksätze
Projekte
- Eigene Projekte →
~/Projectsoder~/src - Gemeinsame Projekte →
/srv - Installierte Software →
/opt
find
-
Dateien suchen:
find . -name "*.txt" -
Direkt löschen:
find . -name "*.txt" -delete
xargs
- Macht aus Pipe-Ausgabe Befehlsargumente.
- Spart viele einzelne Programmaufrufe.
- Immer sicher verwenden mit:
find . -print0 | xargs -0 <befehl>
Moderne Alternative
Wenn möglich:
find . -exec <befehl> {} +
Diese Variante ist oft einfacher und ebenso effizient.