Aufgaben-Python/courses/bash/01_navigation_dateien_und_globbing/index.html

175 lines
9.9 KiB
HTML

<!DOCTYPE html>
<html lang="de">
<head>
<link rel="icon" type="image/svg+xml" href="../../../assets/favicon.svg">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bash 01: Terminal-Navigation &amp; Globbing</title>
<link rel="stylesheet" href="../../../assets/style.css">
<style>
.module-grid {
display: grid;
grid-template-columns: 7fr 5fr;
gap: 24px;
margin-top: 20px;
}
@media (max-width: 992px) {
.module-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<div class="app-layout">
<div class="app-main">
<header>
<div class="header-container">
<div style="display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px;">
<span class="badge badge-neutral">🐧 Linux Bash &amp; Cloud DevOps</span>
<span class="badge badge-neutral">Modul 01 von 16</span>
<span class="badge badge-neutral">⏱️ ca. 15 Min.</span>
<span class="badge badge-success">🎓 IHK AP1 &amp; AP2 Relevanz</span>
</div>
<h1>Bash 01: Terminal-Navigation, Dateioperationen &amp; Globbing</h1>
<p class="content-readable" style="color: #cbd5e1; font-size: 1.05rem;">Beherrsche den Linux-Dateibaum, lerne blitzschnelle Pfad-Navigation und automatisiere Dateioperationen mit Wildcards und Brace Expansion.</p>
</div>
</header>
<main class="container">
<div class="module-grid">
<!-- LINKE SPALTE: Konzept & Aufgaben -->
<div class="module-main-col">
<!-- 1. KERNKONZEPT -->
<section class="card">
<h2>🧭 1. Der Unix-Dateibaum &amp; Pfad-Navigation</h2>
<p class="content-readable">In Unix gibt es keine Laufwerksbuchstaben (wie <code>C:</code>). Alles entspringt dem Root-Verzeichnis <code>/</code> (Single Root Tree). Wir unterscheiden strikt zwischen absoluten Pfaden (beginnen immer mit <code>/</code>) und relativen Pfaden (relativ zum aktuellen Arbeitsverzeichnis <code>pwd</code>).</p>
<div class="code-block">
<div class="code-block-header">
<span class="code-block-title">bash • Navigation &amp; Pfade</span>
<button type="button" class="code-copy-btn" onclick="navigator.clipboard.writeText(this.parentElement.nextElementSibling.innerText); this.innerText='Kopiert! ✓'; setTimeout(()=>this.innerText='Kopieren', 2000);">Kopieren</button>
</div>
<pre style="padding: 12px; margin: 0; background: transparent; color: #f8fafc; font-family: var(--font-mono); font-size: 0.88rem;"><code># Wo bin ich?
pwd # Ausgabe: /home/devops/projects
# Relative vs. Absolute Navigation:
cd /var/log/nginx # Absoluter Pfad
cd ../../etc # Relativer Pfad: Zwei Ebenen hoch, dann in 'etc'
cd ~ # Home-Verzeichnis
cd - # Vorheriges Verzeichnis</code></pre>
</div>
<div class="box box-analogie">
<div class="box-title">🏢 Didaktische Analogie: Das Hochregallager des Betriebssystems</div>
<p><strong>Der Dateibaum:</strong> Stell dir das Linux-Dateisystem wie ein gigantisches Logistikzentrum vor. <code>/</code> ist das Haupttor. Mit <code>mkdir -p</code> stellst du mit einer einzigen Anweisung eine ganze Regalreihe mit Fächern auf.</p>
<p><strong>Globbing (<code>*</code> und <code>{a,b}</code>):</strong> Statt jedes Paket einzeln zu scannen, hältst du eine Schablone hoch: <code>*.yaml</code> greift automatisch alle Konfigurationen, während <code>{dev,prod}</code> im Handumdrehen zwei Umgebungen parallel anlegt!</p>
</div>
</section>
<!-- 2. SUBGOAL-BOARD -->
<section class="card">
<h2>🎯 2. Dein Arbeitsauftrag: 4 Subgoals (Teilziele)</h2>
<p class="content-readable" style="color: var(--text-muted); margin-bottom: 16px;">Bearbeite die Aufgaben in <code>aufgabe.sh</code> schrittweise:</p>
<div class="subgoal-item">
<span class="subgoal-badge">Subgoal 1</span>
<div>
<strong>Projektverzeichnisse anlegen:</strong>
<p style="margin: 4px 0 0 0; font-size: 0.88rem; color: var(--text-secondary);">Implementiere <code>erstelle_projektstruktur(basis_dir)</code> mit <code>mkdir -p</code> für <code>src/components</code>, <code>src/utils</code>, <code>docs/api</code> und <code>backup/logs</code>.</p>
</div>
</div>
<div class="subgoal-item">
<span class="subgoal-badge">Subgoal 2</span>
<div>
<strong>Testdateien erzeugen:</strong>
<p style="margin: 4px 0 0 0; font-size: 0.88rem; color: var(--text-secondary);">Erstelle mit <code>touch</code> und Brace Expansion Beispieldateien in den angelegten Ordnern.</p>
</div>
</div>
<div class="subgoal-item">
<span class="subgoal-badge">Subgoal 3</span>
<div>
<strong>Dateien kopieren &amp; Globbing:</strong>
<p style="margin: 4px 0 0 0; font-size: 0.88rem; color: var(--text-secondary);">Kopiere mit <code>cp</code> und Wildcards (<code>*.yaml</code>, <code>*.log</code>) alle Konfigurationsdateien in das Backup-Verzeichnis.</p>
</div>
</div>
<div class="subgoal-item">
<span class="subgoal-badge">Subgoal 4</span>
<div>
<strong>Temporäre Dateien bereinigen:</strong>
<p style="margin: 4px 0 0 0; font-size: 0.88rem; color: var(--text-secondary);">Nutze <code>rm -f</code> und <code>rm -rf</code>, um Cache- und temporäre Logdateien sauber zu entfernen.</p>
</div>
</div>
</section>
</div>
<!-- RECHTE SPALTE: Referenz, Gotchas & Spickzettel -->
<div class="module-side-col">
<!-- GOTCHAS (STOLPERFALLEN) -->
<div class="box-gotcha">
<h4>⚠️ Häufige Stolperfallen (Pre-Mortem)</h4>
<p style="margin-bottom: 8px;"><strong>1. Fehlendes <code>-p</code> bei mkdir:</strong> Wenn du <code>mkdir a/b/c</code> aufrufst und Ordner <code>a</code> noch nicht existiert, bricht die Shell mit <em>No such file or directory</em> ab. Verwende immer <code>mkdir -p</code>!</p>
<p style="margin: 0;"><strong>2. Word Splitting ohne Quotes:</strong> Setze Variablenpfade in Skripten stets in doppelte Anführungszeichen: <code>"$basis_dir/src"</code>, sonst führen Leerzeichen im Ordnernamen zu fatalen Syntaxfehlern.</p>
</div>
<!-- SYNTAX QUICK REF -->
<div class="box-syntax">
<h4>📌 Syntax-Spickzettel: Shell-Muster</h4>
<table style="width: 100%; border-collapse: collapse; font-size: 0.84rem; text-align: left;">
<thead>
<tr style="border-bottom: 2px solid var(--border-color); background: var(--bg-subtle);">
<th style="padding: 6px 8px;">Muster</th>
<th style="padding: 6px 8px;">Bedeutung</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom: 1px solid var(--border-color);">
<td style="padding: 6px 8px;"><code>*</code></td>
<td style="padding: 6px 8px;">Matcht 0 bis unendlich viele Zeichen</td>
</tr>
<tr style="border-bottom: 1px solid var(--border-color);">
<td style="padding: 6px 8px;"><code>?</code></td>
<td style="padding: 6px 8px;">Matcht exakt 1 Zeichen</td>
</tr>
<tr style="border-bottom: 1px solid var(--border-color);">
<td style="padding: 6px 8px;"><code>{a,b}</code></td>
<td style="padding: 6px 8px;">Brace Expansion (Permutation)</td>
</tr>
<tr>
<td style="padding: 6px 8px;"><code>mkdir -p</code></td>
<td style="padding: 6px 8px;">Erstellt Elternordner automatisch</td>
</tr>
</tbody>
</table>
</div>
<!-- IHK PRÜFUNGSRELEVANZ -->
<div class="card" style="background: rgba(37, 99, 235, 0.05); border: 1px solid rgba(37, 99, 235, 0.2);">
<h4 style="margin: 0 0 6px 0; color: var(--primary);">💡 IHK-Prüfungstipp (AP1)</h4>
<p style="font-size: 0.86rem; color: var(--text-secondary); margin: 0;">In der IHK-Abschlussprüfung Teil 1 wird regelmäßig der Unterschied zwischen relativer und absoluter Pfadangabe sowie die Bedeutung von <code>cd ..</code> und <code>ls -l</code> abgefragt.</p>
</div>
</div>
</div>
</main>
<!-- PERSISTENT STICKY LAUNCH ACTION BAR -->
<div class="sticky-launch-bar">
<div style="display: flex; align-items: center; gap: 12px; color: #f8fafc; font-size: 0.9rem;">
<span>🎯 <strong>Status:</strong> Bereit für die Praxis (4 Teilziele definiert)</span>
</div>
<div style="display: flex; align-items: center; gap: 12px;">
<a href="../../../dashboard.html" class="btn btn-ghost" style="color: #cbd5e1 !important;">← Dashboard</a>
<a href="../../../workspace.html?course=bash&track=track_1_terminal_grundlagen&chapter=01_navigation_dateien_und_globbing" class="btn-cta-launch">
💻 In Web-IDE öffnen &amp; Teilziel 1 anpacken &rarr;
</a>
</div>
</div>
</div>
</div>
<script src="../../../assets/courses_manifest.js"></script>
<script src="../../../assets/course_sidebar.js"></script>
</body>
</html>