CH-Suche

Ein umfangreiches PHP Suche Script um nach den verschiedensten Dingen zu suchen.

<?php
/**
 * Datei-Suchtool
 *
 * @description 	Dieses Skript ermöglicht die Suche nach Dateien basierend auf verschiedenen Kriterien wie Dateiinhalt, Dateiname, Dateityp und Änderungsdatum.
 *
 * @package    		DateiSuchtool
 * @version    		1.2.0
 * @author     		Conny Henn <conny@hennweb.de>
 * @copyright  		Copyright (c) 2023-2025 Conny Henn
 * @license    		MIT License
 * @link       		https://www.HennWeb.de
 * @since      		1.0.0
 *
 * Änderungshistorie:
 * 1.2.0 - 2025-02-28
 *   - Hinzufügen der Möglichkeit, in Unterverzeichnissen zu suchen.
 *   - Verbesserung der Shell-basierten Suche.
 *   - Fehlerbehebungen und Optimierungen.
 *
 * 1.1.0 - 2023-09-30
 *   - Hinzufügen der Sortierfunktion nach Dateigröße, Datum und Name.
 *   - Verbesserung der Benutzeroberfläche.
 *
 * 1.0.0 - 2023-09-15
 *   - Erstveröffentlichung des Datei-Suchtools.
 */
 
// Pufferung der Ausgabe starten
ob_start();

// Funktion zum Hinzufügen mehrerer Dateitypen zum find-Befehl
function addFileTypesToCommand($cmd, $filetypes) {
    // Prüfen, ob Eingabe leer ist
    if (empty($filetypes)) {
        return $cmd;
    }
    
    // Entfernen von Leerzeichen und Aufsplitten bei Kommas
    $filetypes = explode(',', $filetypes);
    
    // Wenn es nur einen Dateityp gibt
    if (count($filetypes) === 1) {
        return $cmd . " -name '*." . trim(escapeshellarg($filetypes[0]), "'\"") . "'";
    }
    
    // Mehrere Dateitypen mit -o (OR) verbinden
    $cmd .= " \\( ";
    $first = true;
    
    foreach ($filetypes as $type) {
        $type = trim($type);
        if (empty($type)) continue;
        
        if (!$first) {
            $cmd .= " -o ";
        }
        
        $cmd .= "-name '*." . trim(escapeshellarg($type), "'\"") . "'";
        $first = false;
    }
    
    $cmd .= " \\)";
    
    return $cmd;
}

// Funktion zur Änderung des PHP-basierten Suchfilters für mehrere Dateitypen
function matchesFileType($extension, $filetypes) {
    if (empty($filetypes)) {
        return true;
    }
    
    $typeArray = array_map('trim', explode(',', $filetypes));
    foreach ($typeArray as $type) {
        if (strcasecmp($extension, $type) === 0) {
            return true;
        }
    }
    
    return false;
}
/**
 * Extrahiert einen bestimmten Wert aus dem DocBlock der aktuellen Datei.
 *
 * @param string $key Der zu extrahierende Wert (z.B. "version", "author", "copyright")
 * @return string Der extrahierte Wert oder "Unbekannt" wenn nicht gefunden
 */
function getInfoHead($key) {
    // Den Quelltext der aktuellen Datei einlesen
    $source = file_get_contents(__FILE__);
    
    // Regulärer Ausdruck, um den DocBlock zu finden und zu extrahieren
    preg_match('/\/\*\*.*?\*\//s', $source, $docblock);
    
    if (!empty($docblock[0])) {
        // Suchen nach der angegebenen Information
        preg_match('/@' . preg_quote($key, '/') . '\s+(.+?)($|\n|\r)/i', $docblock[0], $match);
        
        if (!empty($match[1])) {
            return trim($match[1]);
        }
    }
    
    return 'Unbekannt';
}
?>

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Datei-Suchtool</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 20px;
        }
        .container {
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            background-color: #fff;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        h1 {
            text-align: center;
            color: #333;
        }
        form {
            margin-bottom: 20px;
        }
        label {
            display: block;
            margin-bottom: 8px;
            font-weight: bold;
        }
        select, input[type="text"], input[type="submit"] {
            width: 100%;
            padding: 10px;
            margin-bottom: 20px;
            border-radius: 4px;
            border: 1px solid #ccc;
            box-sizing: border-box;
        }
        input[type="submit"] {
            background-color: #007BFF;
            color: white;
            border: none;
            cursor: pointer;
        }
        input[type="submit"]:hover {
            background-color: #0056b3;
        }
        .spinner {
            display: none;
            margin: 0 auto;
            border: 8px solid #f3f3f3;
            border-top: 8px solid #007BFF;
            border-radius: 50%;
            width: 60px;
            height: 60px;
            animation: spin 2s linear infinite;
        }
        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
        pre {
            background-color: #f4f4f4;
            padding: 10px;
            border-radius: 4px;
            border: 1px solid #ddd;
            white-space: pre-wrap;
        }
        .checkbox-container {
            margin-bottom: 20px;
        }
        .checkbox-container label {
            display: inline;
            font-weight: normal;
            margin-left: 5px;
        }
        input[type="checkbox"] {
            vertical-align: middle;
        }
    </style>
    <script>
        // Zeigt den Spinner an, wenn das Formular abgeschickt wird
        function showSpinner() {
            document.getElementById('spinner').style.display = 'block';
        }
        
        // Prüft, ob das Suchbegriff-Feld erforderlich ist, basierend auf der ausgewählten Suchart
        function checkRequiredFields() {
            var suchart = document.getElementById('suche').value;
            var suchbegriff = document.getElementById('sbg');
            var filetype = document.getElementById('filetype');
            
            // Bei Suche nach Dateiänderungsdatum (Option 3) ist der Suchbegriff optional
            if (suchart == '3') {
                suchbegriff.removeAttribute('required');
            } else {
            //    suchbegriff.setAttribute('required', 'required');
            }
            
            // Bei Suche nach Dateityp (Option 4) ist der Dateityp erforderlich
            if (suchart == '4') {
                filetype.setAttribute('required', 'required');
                document.querySelector('label[for="filetype"]').innerHTML = 'Dateityp (erforderlich, durch Komma getrennt)';
            } else {
                filetype.removeAttribute('required');
                document.querySelector('label[for="filetype"]').innerHTML = 'Dateityp (optional, durch Komma getrennt)';
            }
        }
        
        // Funktion beim Laden der Seite ausführen
        document.addEventListener('DOMContentLoaded', function() {
            checkRequiredFields();
        });
    </script>
</head>

<body>

<div class="container">
    <h1>Datei-Suchtool <?php echo getInfoHead("version"); ?></h1>
    <form method="POST" onsubmit="showSpinner()">
        <label for="suche">Suchart</label>
        <select name="suche" id="suche" onchange="checkRequiredFields()">
            <option value="1" <?php if (isset($_POST['suche']) && $_POST['suche'] == 1) echo 'selected'; ?>>Im Dateiinhalt suchen</option>
            <option value="2" <?php if (isset($_POST['suche']) && $_POST['suche'] == 2) echo 'selected'; ?>>Nach Dateinamen suchen</option>
            <option value="3" <?php if (isset($_POST['suche']) && $_POST['suche'] == 3) echo 'selected'; ?>>Nach Dateiänderungsdatum suchen</option>
            <option value="4" <?php if (isset($_POST['suche']) && $_POST['suche'] == 4) echo 'selected'; ?>>Nach Dateityp suchen</option>
        </select>

        <label for="sbg">Suchbegriff oder Dateiname</label>
        <input type="text" name="sbg" id="sbg" placeholder="Suchbegriff oder Dateiname eingeben" value="<?php if (isset($_POST['sbg'])) echo htmlspecialchars($_POST['sbg']); ?>">

        <label for="filetype">Dateityp (optional, durch Komma getrennt)</label>
        <input type="text" name="filetype" id="filetype" placeholder="z.B. txt, php, jpg" value="<?php if (isset($_POST['filetype'])) echo htmlspecialchars($_POST['filetype']); ?>">

        <label for="days">Alter der Dateien in Tagen (optional)</label>
        <input type="text" name="days" id="days" placeholder="z.B. -30 für weniger als 30 Tage alt" value="<?php if (isset($_POST['days'])) echo htmlspecialchars($_POST['days']); ?>">

        <label for="sort">Sortieren nach</label>
        <select name="sort" id="sort">
            <option value="" <?php if (isset($_POST['sort']) && $_POST['sort'] == '') echo 'selected'; ?>>Keine Sortierung</option>
            <option value="size" <?php if (isset($_POST['sort']) && $_POST['sort'] == 'size') echo 'selected'; ?>>Dateigröße</option>
            <option value="date" <?php if (isset($_POST['sort']) && $_POST['sort'] == 'date') echo 'selected'; ?>>Datum</option>
            <option value="name" <?php if (isset($_POST['sort']) && $_POST['sort'] == 'name') echo 'selected'; ?>>Dateiname</option>
        </select>
        
        <div class="checkbox-container">
            <input type="checkbox" name="show_size" id="show_size" <?php if (isset($_POST['show_size'])) echo 'checked'; ?>>
            <label for="show_size">Dateigröße anzeigen</label>
        </div>
        
        <div class="checkbox-container">
            <input type="checkbox" name="show_datetime" id="show_datetime" <?php if (isset($_POST['show_datetime'])) echo 'checked'; ?>>
            <label for="show_datetime">Datum und Uhrzeit anzeigen</label>
        </div>
		
		<div class="checkbox-container">
            <input type="checkbox" name="search_subdirs" id="search_subdirs" <?php if (isset($_POST['search_subdirs'])) echo 'checked'; ?>>
            <label for="search_subdirs">In Unterverzeichnissen suchen</label>
        </div>
		
        <input type="submit" value="Suchen">

        <div>
            Status: <?php if (function_exists('shell_exec') && is_callable('shell_exec')) {
                echo "Schnellsuche aktiv - (shell_exec = on)";
            } else {
                echo "für schnellere Suche bitte an Hoster wenden um (shell_exec = on) zu aktivieren.";
            }
            ?>
        </div>
    </form>

    <div id="spinner" class="spinner"></div>
	<?php
    // Funktion zum Suchen nach Dateien ohne Verwendung von shell_exec()
    function searchFiles($dir, $search, $filetype = '', $days = '', $searchContent = false, $searchSubdirs = true) {
		$results = [];
    
		// Iterator basierend auf der Checkbox auswählen
		if ($searchSubdirs) {
			$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
		} else {
			$files = new DirectoryIterator($dir);
		}

		foreach ($files as $file) {
			// Überspringe Verzeichnisse, wenn nicht in Unterverzeichnissen gesucht wird
			if (!$searchSubdirs && $file->isDir()) continue;
			
			// Überspringe Verzeichnisse, wenn in Unterverzeichnissen gesucht wird
			if ($searchSubdirs && $file->isDir()) continue;
			
			// Dateityp-Filter
			if ($filetype && !matchesFileType($file->getExtension(), $filetype)) continue;

			// Datumsfilter
			if ($days) {
				$fileTime = filemtime($file->getRealPath());
				if ($days < 0 && time() - $fileTime > abs($days) * 86400) continue;
				if ($days > 0 && time() - $fileTime < $days * 86400) continue;
			}

			// Suche nach Dateiänderungsdatum (Suchbegriff optional)
			if (empty($search) && $searchContent === false) {
				$results[] = [
					'path' => $file->getRealPath(),
					'date' => date("Y-m-d H:i:s", filemtime($file->getRealPath())),
					'size' => filesize($file->getRealPath())
				];
				continue;
			}

			// Suche im Dateiinhalt oder Dateinamen
			if ($searchContent) {
				if (stripos(file_get_contents($file->getRealPath()), $search) !== false) {
					$results[] = [
						'path' => $file->getRealPath(),
						'date' => date("Y-m-d H:i:s", filemtime($file->getRealPath())),
						'size' => filesize($file->getRealPath())
					];
				}
			} else {
				if (stripos($file->getFilename(), $search) !== false) {
					$results[] = [
						'path' => $file->getRealPath(),
						'date' => date("Y-m-d H:i:s", filemtime($file->getRealPath())),
						'size' => filesize($file->getRealPath())
					];
				}
			}
		}

		return $results;
	}

    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $suche = intval($_POST['suche']);
        $sbg = isset($_POST['sbg']) ? $_POST['sbg'] : '';
        $filetype = !empty($_POST['filetype']) ? $_POST['filetype'] : '';
        $days = !empty($_POST['days']) ? intval($_POST['days']) : '';
        $sort = $_POST['sort'];
        $show_datetime = isset($_POST['show_datetime']);
        $show_size = isset($_POST['show_size']);
		$searchSubdirs = isset($_POST['search_subdirs']);

        // Prüfen, ob shell_exec erlaubt ist
        if (function_exists('shell_exec') && is_callable('shell_exec')) {
            // Shell-basierte Suche
            if ($suche == 1) {
                // Basisbefehl für die Suche
                $cmd = "find .";
				
				// Wenn nicht in Unterverzeichnissen gesucht werden soll
				if (!$searchSubdirs) {
					$cmd .= " -maxdepth 1";
				}
                
                // Dateityp-Filter hinzufügen
                if (!empty($filetype)) {
                    $cmd = addFileTypesToCommand($cmd, $filetype);
                } else {
                    // Unerwünschte Dateitypen ausschließen
                    $cmd .= " ! -path '*.png' ! -path '*.jpg' ! -path '*.webp' ! -path '*.pdf'";
                }
                
                // Grep-Befehl für die Suche im Inhalt
                $cmd .= " -type f -exec grep -l " . escapeshellarg($sbg) . " {} \\;";
                
                // Wenn Datum oder Größe angezeigt werden sollen oder sortiert werden soll,
                // müssen wir die Ergebnisse in eine temporäre Datei speichern und dann verarbeiten
                if ($show_datetime || $show_size || !empty($sort)) {
                    $tempFile = tempnam(sys_get_temp_dir(), 'search_');
                    $cmd .= " > " . escapeshellarg($tempFile);
                    
                    // Ersten Befehl ausführen
                    shell_exec($cmd);
                    
                    // Zweiter Befehl zum Formatieren und Sortieren der Ergebnisse
                    $cmd2 = "cat " . escapeshellarg($tempFile) . " | xargs -I{} find {} ";
                    
                    // Format basierend auf Checkboxen
                    if ($show_datetime && $show_size) {
                        $cmd2 .= "-printf '%TY-%Tm-%Td %TH:%TM:%TS %s %p\\n' | sed 's/\\.[0-9]\\+//' | awk '{printf \"%s %s %12d %s\\n\", \$1, \$2, \$3, \$4}'";
                    } elseif ($show_datetime && !$show_size) {
                        $cmd2 .= "-printf '%TY-%Tm-%Td %TH:%TM:%TS %p\\n' | sed 's/\\.[0-9]\\+//' | awk '{printf \"%s %s %s\\n\", \$1, \$2, \$3}'";
                    } elseif (!$show_datetime && $show_size) {
                        $cmd2 .= "-printf '%s %p\\n' | awk '{printf \"%12d %s\\n\", \$1, \$2}'";
                    } else {
                        $cmd2 .= "-printf '%p\\n'";
                    }
					
					// Sortierung hinzufügen
                    if ($sort == "size") {
                        if ($show_size && $show_datetime) {
                            $cmd2 .= " | sort -k3 -n";
                        } elseif ($show_size && !$show_datetime) {
                            $cmd2 .= " | sort -k1 -n";
                        } else {
                            $cmd2 = "cat " . escapeshellarg($tempFile) . " | xargs -I{} find {} -printf '%s %p\\n' | sort -k1 -n";
                            if (!$show_size) {
                                $cmd2 .= " | awk '{print \$2}'";
                            } else {
                                $cmd2 .= " | awk '{printf \"%12d %s\\n\", \$1, \$2}'";
                            }
                        }
                    } elseif ($sort == "date") {
                        if ($show_datetime) {
                            $cmd2 .= " | sort -k1,2";
                        } else {
                            $cmd2 = "cat " . escapeshellarg($tempFile) . " | xargs -I{} find {} -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\\n' | sort -k1,2";
                            if ($show_size) {
                                $cmd2 = "cat " . escapeshellarg($tempFile) . " | xargs -I{} find {} -printf '%TY-%Tm-%Td %TH:%TM:%TS %s %p\\n' | sort -k1,2 | sed 's/\\.[0-9]\\+//'";
                                $cmd2 .= " | awk '{printf \"%12d %s\\n\", \$3, \$4}'";
                            } else {
                                $cmd2 .= " | sed 's/\\.[0-9]\\+//' | awk '{print \$3}'";
                            }
                        }
                    } elseif ($sort == "name") {
                        if ($show_datetime && $show_size) {
                            $cmd2 .= " | sort -k4";
                        } elseif ($show_datetime && !$show_size) {
                            $cmd2 .= " | sort -k3";
                        } elseif (!$show_datetime && $show_size) {
                            $cmd2 .= " | sort -k2";
                        } else {
                            $cmd2 .= " | sort";
                        }
                    }
                    
                    echo "<h2>Befehl für Inhaltssuche:</h2>";
                    echo "<pre>$cmd\n$cmd2</pre>";
                    
                    // Befehl ausführen und Ergebnis ausgeben
                    $output = shell_exec($cmd2);
                    
                    // Temporäre Datei löschen
                    unlink($tempFile);
                    
                    if (empty($output)) {
                        echo "<p>Keine Dateien gefunden.</p>";
                    } else {
                        echo "<pre>$output</pre>";
                    }
                } else {
                    // Standard-Ausgabe ohne zusätzliche Formatierung
                    echo "<h2>Befehl für Inhaltssuche:</h2>";
                    echo "<pre>$cmd</pre>";
                    
                    $output = shell_exec($cmd);
                    if (empty($output)) {
                        echo "<p>Keine Dateien gefunden.</p>";
                    } else {
                        echo "<pre>$output</pre>";
                    }
                }
            } elseif ($suche == 2) {
                $cmd = "find . -iname " . escapeshellarg("*" . $sbg . "*");
                
                // Dateityp-Filter hinzufügen
                if (!empty($filetype)) {
                    $cmd = addFileTypesToCommand($cmd, $filetype);
                }
                
                // Format basierend auf Checkboxen
                if ($show_datetime && $show_size) {
                    $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %s %p\\n' | sed 's/\\.[0-9]\\+//' | awk '{printf \"%s %s %12d %s\\n\", \$1, \$2, \$3, \$4}'";
                } elseif ($show_datetime && !$show_size) {
                    $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\\n' | sed 's/\\.[0-9]\\+//' | awk '{printf \"%s %s %s\\n\", \$1, \$2, \$3}'";
                } elseif (!$show_datetime && $show_size) {
                    $cmd .= " -printf '%s %p\\n' | awk '{printf \"%12d %s\\n\", \$1, \$2}'";
                } else {
                    $cmd .= " -printf '%p\\n'";
                }
				
				// Wenn nicht in Unterverzeichnissen gesucht werden soll
				if (!$searchSubdirs) {
					$cmd .= " -maxdepth 1";
				}
				
				// Sortierung
                if ($sort == "size") {
                    if ($show_size && $show_datetime) {
                        $cmd .= " | sort -k3 -n";
                    } elseif ($show_size && !$show_datetime) {
                        $cmd .= " | sort -k1 -n";
                    } else {
                        // Wenn Dateigröße nicht angezeigt wird, trotzdem danach sortieren
                        $cmd = "find . -iname " . escapeshellarg("*" . $sbg . "*");
                        if (!empty($filetype)) {
                            $cmd = addFileTypesToCommand($cmd, $filetype);
                        }
                        $cmd .= " -printf '%s %p\\n' | sort -k1 -n | awk '{print \$2}'";
                    }
                } elseif ($sort == "date") {
                    if ($show_datetime) {
                        $cmd .= " | sort -k1,2";
                    } else {
                        // Wenn Datum nicht angezeigt wird, trotzdem danach sortieren
                        $cmd = "find . -iname " . escapeshellarg("*" . $sbg . "*");
                        if (!empty($filetype)) {
                            $cmd = addFileTypesToCommand($cmd, $filetype);
                        }
                        
                        if ($show_size) {
                            $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %s %p\\n' | sort -k1,2 | sed 's/\\.[0-9]\\+//' | awk '{printf \"%12d %s\\n\", \$3, \$4}'";
                        } else {
                            $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\\n' | sort -k1,2 | sed 's/\\.[0-9]\\+//' | awk '{print \$3}'";
                        }
                    }
                } elseif ($sort == "name") {
                    if ($show_datetime && $show_size) {
                        $cmd .= " | sort -k4";
                    } elseif ($show_datetime && !$show_size) {
                        $cmd .= " | sort -k3";
                    } elseif (!$show_datetime && $show_size) {
                        $cmd .= " | sort -k2";
                    } else {
                        $cmd .= " | sort";
                    }
                }
                
                echo "<h2>Befehl: $cmd</h2>";
                flush();
                $output = shell_exec($cmd);
                if (empty($output)) {
                    echo "<p>Keine Dateien gefunden.</p>";
                } else {
                    echo "<pre>$output</pre>";
                }
            } elseif ($suche == 3) {
                $cmd = "find .";
                
                // Suchbegriff nur hinzufügen, wenn angegeben
                if (!empty($sbg)) {
                    $cmd .= " -iname " . escapeshellarg("*" . $sbg . "*");
                }
                
                // Dateityp-Filter hinzufügen
                if (!empty($filetype)) {
                    $cmd = addFileTypesToCommand($cmd, $filetype);
                }
                
                if (!empty($days)) {
                    $cmd .= " -mtime ".escapeshellarg($days);
                }
				
                // Wenn nicht in Unterverzeichnissen gesucht werden soll
				if (!$searchSubdirs) {
					$cmd .= " -maxdepth 1";
				}
				
                // Format basierend auf Checkboxen
                if ($show_datetime && $show_size) {
                    $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %s %p\\n' | sed 's/\\.[0-9]\\+//' | awk '{printf \"%s %s %12d %s\\n\", \$1, \$2, \$3, \$4}'";
                } elseif ($show_datetime && !$show_size) {
                    $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\\n' | sed 's/\\.[0-9]\\+//' | awk '{printf \"%s %s %s\\n\", \$1, \$2, \$3}'";
                } elseif (!$show_datetime && $show_size) {
                    $cmd .= " -printf '%s %p\\n' | awk '{printf \"%12d %s\\n\", \$1, \$2}'";
                } else {
                    $cmd .= " -printf '%p\\n'";
                }
				// Sortierung hinzufügen
                if ($sort == "size") {
                    if ($show_size && $show_datetime) {
                        $cmd .= " | sort -k3 -n";  // Sortierung nach Dateigröße (3. Spalte, numerisch)
                    } elseif ($show_size && !$show_datetime) {
                        $cmd .= " | sort -k1 -n";  // Sortierung nach Dateigröße (1. Spalte, numerisch)
                    } else {
                        // Wenn Dateigröße nicht angezeigt wird, müssen wir sie trotzdem für die Sortierung bekommen
                        $cmd = "find .";
                        
                        // Suchbegriff nur hinzufügen, wenn angegeben
                        if (!empty($sbg)) {
                            $cmd .= " -iname " . escapeshellarg("*" . $sbg . "*");
                        }
                        
                        if (!empty($filetype)) {
                            $cmd = addFileTypesToCommand($cmd, $filetype);
                        }
                        if (!empty($days)) {
                            $cmd .= " -mtime ".escapeshellarg($days);
                        }
                        $cmd .= " -printf '%s %p\\n' | sort -k1 -n | awk '{print \$2}'";
                    }
                } elseif ($sort == "date") {
                    if ($show_datetime) {
                        $cmd .= " | sort -k1,2";   // Sortierung nach Datum und Zeit (Spalten 1-2)
                    } else {
                        // Wenn Datum nicht angezeigt wird, müssen wir es trotzdem für die Sortierung bekommen
                        $cmd = "find .";
                        
                        // Suchbegriff nur hinzufügen, wenn angegeben
                        if (!empty($sbg)) {
                            $cmd .= " -iname " . escapeshellarg("*" . $sbg . "*");
                        }
                        
                        if (!empty($filetype)) {
                            $cmd = addFileTypesToCommand($cmd, $filetype);
                        }
                        if (!empty($days)) {
                            $cmd .= " -mtime ".escapeshellarg($days);
                        }
                        
                        if ($show_size) {
                            $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %s %p\\n' | sort -k1,2 | sed 's/\\.[0-9]\\+//' | awk '{printf \"%12d %s\\n\", \$3, \$4}'";
                        } else {
                            $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\\n' | sort -k1,2 | sed 's/\\.[0-9]\\+//' | awk '{print \$3}'";
                        }
                    }
                } elseif ($sort == "name") {
                    if ($show_datetime && $show_size) {
                        $cmd .= " | sort -k4";     // Sortierung nach Dateiname (4. Spalte)
                    } elseif ($show_datetime && !$show_size) {
                        $cmd .= " | sort -k3";     // Sortierung nach Dateiname (3. Spalte)
                    } elseif (!$show_datetime && $show_size) {
                        $cmd .= " | sort -k2";     // Sortierung nach Dateiname (2. Spalte)
                    } else {
                        $cmd .= " | sort";         // Sortierung nach Dateiname (1. Spalte)
                    }
                }
                
                echo "<h2>Befehl: $cmd</h2>";
                flush();
                $output = shell_exec($cmd);
                if (empty($output)) {
                    echo "<p>Keine Dateien gefunden.</p>";
                } else {
                    echo "<pre>$output</pre>";
                }
				} elseif ($suche == 4) {
                // Bei Suche nach Dateityp muss der Dateityp angegeben sein
                if (empty($filetype)) {
                    echo "<p>Fehler: Bitte geben Sie mindestens einen Dateityp an.</p>";
                } else {
                    $cmd = "find .";
                    
                    // Dateityp-Filter hinzufügen
                    $cmd = addFileTypesToCommand($cmd, $filetype);
                    
                    // Dateiänderungsdatum hinzufügen, wenn angegeben
                    if ($days) {
                        $cmd .= " -mtime $days";
                    }
                    
                    // Format basierend auf Checkboxen
                    if ($show_datetime && $show_size) {
                        $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %s %p\\n' | sed 's/\\.[0-9]\\+//' | awk '{printf \"%s %s %12d %s\\n\", \$1, \$2, \$3, \$4}'";
                    } elseif ($show_datetime && !$show_size) {
                        $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\\n' | sed 's/\\.[0-9]\\+//' | awk '{printf \"%s %s %s\\n\", \$1, \$2, \$3}'";
                    } elseif ($show_datetime && $show_size) {
                        $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %s %p\\n' | sed 's/\\.[0-9]\\+//' | awk '{printf \"%s %s %12d %s\\n\", \$1, \$2, \$3, \$4}'";
                    } elseif ($show_datetime && !$show_size) {
                        $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\\n' | sed 's/\\.[0-9]\\+//' | awk '{printf \"%s %s %s\\n\", \$1, \$2, \$3}'";
                    } elseif (!$show_datetime && $show_size) {
                        $cmd .= " -printf '%s %p\\n' | awk '{printf \"%12d %s\\n\", \$1, \$2}'";
                    } else {
                        $cmd .= " -printf '%p\\n'";
                    }
                    
					// Wenn nicht in Unterverzeichnissen gesucht werden soll
					if (!$searchSubdirs) {
						$cmd .= " -maxdepth 1";
					}
					
                    // Sortierung
                    if ($sort == "size") {
                        if ($show_size && $show_datetime) {
                            $cmd .= " | sort -k3 -n";
                        } elseif ($show_size && !$show_datetime) {
                            $cmd .= " | sort -k1 -n";
                        } else {
                            // Wenn Dateigröße nicht angezeigt wird, trotzdem danach sortieren
                            $cmd = "find .";
                            $cmd = addFileTypesToCommand($cmd, $filetype);
                            if ($days) {
                                $cmd .= " -mtime $days";
                            }
                            $cmd .= " -printf '%s %p\\n' | sort -k1 -n | awk '{print \$2}'";
                        }
                    } elseif ($sort == "date") {
                        if ($show_datetime) {
                            $cmd .= " | sort -k1,2";
                        } else {
                            // Wenn Datum nicht angezeigt wird, trotzdem danach sortieren
                            $cmd = "find .";
                            $cmd = addFileTypesToCommand($cmd, $filetype);
                            if ($days) {
                                $cmd .= " -mtime $days";
                            }
                            
                            if ($show_size) {
                                $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %s %p\\n' | sort -k1,2 | sed 's/\\.[0-9]\\+//' | awk '{printf \"%12d %s\\n\", \$3, \$4}'";
                            } else {
                                $cmd .= " -printf '%TY-%Tm-%Td %TH:%TM:%TS %p\\n' | sort -k1,2 | sed 's/\\.[0-9]\\+//' | awk '{print \$3}'";
                            }
                        }
                    } elseif ($sort == "name") {
                        if ($show_datetime && $show_size) {
                            $cmd .= " | sort -k4";
                        } elseif ($show_datetime && !$show_size) {
                            $cmd .= " | sort -k3";
                        } elseif (!$show_datetime && $show_size) {
                            $cmd .= " | sort -k2";
                        } else {
                            $cmd .= " | sort";
                        }
                    }
                    
                    echo "<h2>Befehl: $cmd</h2>";
                    flush();
                    $output = shell_exec($cmd);
                    if (empty($output)) {
                        echo "<p>Keine Dateien gefunden.</p>";
                    } else {
                        echo "<pre>$output</pre>";
                    }
                }
            }
			} else {
            // PHP-basierte Suche
            echo "<h2>Ergebnisse der Suche (PHP-basiert):</h2>";

            if ($suche == 1) {
                $results = searchFiles('.', $sbg, $filetype, $days, true);
            } elseif ($suche == 2) {
                $results = searchFiles('.', $sbg, $filetype, $days, false);
            } elseif ($suche == 3) {
                $results = searchFiles('.', $sbg, $filetype, $days, false);
            } elseif ($suche == 4) {
                if (empty($filetype)) {
                    echo "<p>Fehler: Bitte geben Sie mindestens einen Dateityp an.</p>";
                    $results = [];
                } else {
                    // Bei Option 4 wird der Suchbegriff ignoriert und nur nach Dateityp gesucht
                    $results = searchFiles('.', '', $filetype, $days, false);
                }
            }

            // Sortieren der Ergebnisse
            if ($sort == "size") {
                usort($results, function($a, $b) {
                    return $a['size'] - $b['size'];
                });
            } elseif ($sort == "date") {
                usort($results, function($a, $b) {
                    return strtotime($a['date']) - strtotime($b['date']);
                });
            } elseif ($sort == "name") {
                usort($results, function($a, $b) {
                    return strcmp($a['path'], $b['path']);
                });
            }

            if (!empty($results)) {
                echo "<pre>";
                foreach ($results as $result) {
                    $output = "";
                    if ($show_datetime) {
                        $output .= $result['date'] . " ";
                    }
                    if ($show_size) {
                        $output .= sprintf("%12d ", $result['size']);
                    }
                    $output .= $result['path'];
                    echo $output . "\n";
                }
                echo "</pre>";
            } else {
                echo "<p>Keine Dateien gefunden.</p>";
            }
        }
    }

    // Spinner ausblenden, nachdem die gesamte Ausgabe erfolgt ist
    echo "<script>document.getElementById('spinner').style.display = 'none';</script>";

    // Pufferung der Ausgabe beenden und senden
    ob_end_flush();
    ?>
</div>

</body>
</html>

Veröffentlicht in Allgemein.

Schreibe einen Kommentar