7.4 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.
SNMP: MIB-Auflösung und OID-Übersetzung mit net-snmp
OIDs werden trotz eingehängter MIB nicht textuell aufgelöst
Mögliche Ursachen
MIB wird nicht geladen
- MIB liegt nicht in einem durchsuchten Verzeichnis. Prüfen mit
net-snmp-config --default-mibdirs; übliche Pfade sind~/.snmp/mibs,/usr/share/snmp/mibs. - MIB nicht per
-moder Konfiguration aktiviert. Test:snmpwalk -m ALL ...oder in~/.snmp/snmp.confbzw./etc/snmp/snmp.conf:mibs +MEIN-MIB. - net-snmp lädt standardmäßig nur ein Minimalset.
mibs :deaktiviert alles.
Dateiname passt nicht zum MIB-Namen
- net-snmp löst Module über den Dateinamen auf; der interne Modulname (vor
DEFINITIONS ::= BEGIN) muss stimmen.
Fehlende IMPORTS / Abhängigkeiten
-
Importierte MIBs (z. B.
SNMPv2-SMI,SNMPv2-TC, herstellereigene Basis-MIBs) fehlen → Parsen schlägt still fehl. Sichtbar machen mit:snmptranslate -M+/pfad -m ALL -Dparse-mibs OID
Parse-/Syntaxfehler in der MIB
-
Diagnose:
snmptranslate -Le -m ALL -M /pfad -On MEIN-MIB::objektFehler werden auf stderr ausgegeben.
Numerische OID gehört zu keinem geladenen Zweig
- Die abgefragte Enterprise-OID liegt außerhalb dessen, was die MIB definiert (falsche/unvollständige MIB).
Schneller Prüfweg
snmptranslate -m +MEIN-MIB -IR meinObjekt→ gibt es einen Treffer?snmptranslate -Le -M /pfad/zu/mibs -m ALL .1.3.6.1.4.1.<enterprise>→ Fehler beim Laden?- Fehlende Import-MIBs nachlegen.
Meist ist es eine fehlende Import-Abhängigkeit oder ein falscher Suchpfad/Modulname.
Umgekehrt: von MIB::objekt auf die OID schließen
Textuellen Namen statt numerischer OID übergeben (MIB muss geladen sein):
snmpget -v2c -c public host MEIN-MIB::meinObjekt.0
snmpwalk -v2c -c public host MEIN-MIB::meinObjekt
Vorher ohne Gerät prüfen (Name → OID)
snmptranslate -On MEIN-MIB::meinObjekt
-On erzwingt die numerische Ausgabe, also die zugehörige OID.
Umgekehrt (OID → Name):
snmptranslate .1.3.6.1.4.1.xxx
Nützliche Varianten
-
Objektname allein suchen (ohne
MIB::-Präfix):snmptranslate -IR -On meinObjekt -
Vollständigen symbolischen Pfad anzeigen:
snmptranslate -Of MEIN-MIB::meinObjekt -
Objektdetails (Typ, Zugriff, Beschreibung):
snmptranslate -Td MEIN-MIB::meinObjekt
Hinweise
- Scheitert
snmpget MEIN-MIB::meinObjekt.0mit „Unknown Object Identifier", ist die MIB nicht geladen → mit-m +MEIN-MIBbzw.-M /pfadergänzen. - Bei skalaren Objekten die
.0-Instanz nicht vergessen.