Praktische Übung: Erstellen eines Skripts zur Dateisäuberung
Nachdem Sie die verschiedenen Methoden zum Entfernen von Elementen aus Bash-Arrays verstanden haben, wollen wir dieses Wissen auf eine praktische Situation anwenden. Wir erstellen ein Skript, das hilft, ein Verzeichnis zu bereinigen, indem bestimmte Dateitypen herausgefiltert werden.
Die Herausforderung der Dateisäuberung
Stellen Sie sich vor, Sie haben ein Verzeichnis mit verschiedenen Dateitypen (Textdateien, Bilder, Dokumente) und möchten bestimmte Dateitypen selektiv entfernen. Wir verwenden ein Bash-Array, um diese Dateien zu verwalten und unser Wissen über das Filtern von Arrays anzuwenden.
Schritt 1: Einrichten eines Testverzeichnisses mit Beispieldateien
Zuerst erstellen wir ein Testverzeichnis mit einigen Beispieldateien. Öffnen Sie Ihr Terminal und führen Sie aus:
mkdir -p /home/labex/project/test_files
cd /home/labex/project/test_files
## Create some sample files
touch file1.txt file2.txt document1.pdf document2.pdf image1.jpg image2.jpg script.sh config.yaml
Überprüfen Sie, ob die Dateien erstellt wurden:
ls -la
Sie sollten die Liste der Beispieldateien sehen, die wir gerade erstellt haben.
Schritt 2: Erstellen des Skripts zur Dateisäuberung
Erstellen wir nun unser Skript, das Array-Operationen zum Filtern von Dateien verwendet. Erstellen Sie eine neue Datei namens cleanup_files.sh im Verzeichnis /home/labex/project:
#!/bin/bash
## Directory to scan
target_dir=${1:-"/home/labex/project/test_files"}
## File extension to filter out
extension_to_remove=${2:-"txt"}
echo "Scanning directory: $target_dir"
echo "Will remove files with extension: $extension_to_remove"
## Change to the target directory
cd "$target_dir" || {
echo "Directory not found!"
exit 1
}
## Get all files in the directory
all_files=(*)
echo "All files: ${all_files[@]}"
## Create an array to store files to keep
declare -a files_to_keep=()
## Filter out files with the specified extension
for file in "${all_files[@]}"; do
if [[ "$file" != *.$extension_to_remove ]]; then
files_to_keep+=("$file")
fi
done
echo "Files to keep: ${files_to_keep[@]}"
## Create an array of files to remove
declare -a files_to_remove=()
for file in "${all_files[@]}"; do
if [[ "$file" == *.$extension_to_remove ]]; then
files_to_remove+=("$file")
fi
done
echo "Files that would be removed: ${files_to_remove[@]}"
## Ask for confirmation before removing
echo
echo "This script is in simulation mode and won't actually delete any files."
echo "In a real scenario, you would ask for confirmation before deletion:"
echo "read -p 'Are you sure you want to remove these files? (y/n): ' confirm"
echo "if [ \"\$confirm\" == \"y\" ]; then rm \"\${files_to_remove[@]}\"; fi"
Speichern Sie die Datei und machen Sie sie ausführbar:
chmod +x /home/labex/project/cleanup_files.sh
Schritt 3: Ausführen des Skripts zur Dateisäuberung
Führen wir nun unser Skript aus, um zu sehen, wie es Dateien identifiziert und filtert:
./cleanup_files.sh
Dies sollte eine Ausgabe anzeigen, die angibt, welche Dateien entfernt werden würden (die mit der Erweiterung .txt).
Probieren Sie es mit verschiedenen Dateierweiterungen aus:
./cleanup_files.sh /home/labex/project/test_files pdf
Dies zeigt Dateien mit der Erweiterung .pdf als diejenigen an, die entfernt werden würden.
Schritt 4: Erweitern des Skripts mit Stapelverarbeitung
Erweitern wir unser Skript, um mehrere Dateierweiterungen gleichzeitig zu verarbeiten. Erstellen Sie eine neue Datei namens advanced_cleanup.sh im Verzeichnis /home/labex/project:
#!/bin/bash
## Directory to scan
target_dir=${1:-"/home/labex/project/test_files"}
## Default extensions to remove
extensions=("txt" "pdf")
## Override default extensions if provided as arguments
if [ $## -gt 1 ]; then
extensions=("${@:2}")
fi
echo "Scanning directory: $target_dir"
echo "Will filter files with these extensions: ${extensions[@]}"
## Change to the target directory
cd "$target_dir" || {
echo "Directory not found!"
exit 1
}
## Get all files in the directory
all_files=(*)
echo "All files: ${all_files[@]}"
## Create an array to store files to keep
declare -a files_to_keep=()
## Create an array to store files to remove
declare -a files_to_remove=()
## Process each file
for file in "${all_files[@]}"; do
## Extract the file extension
file_ext="${file##*.}"
## Check if the file extension is in our list
should_remove=false
for ext in "${extensions[@]}"; do
if [ "$file_ext" == "$ext" ]; then
should_remove=true
break
fi
done
## Add to appropriate array based on whether it should be removed
if [ "$should_remove" == true ]; then
files_to_remove+=("$file")
else
files_to_keep+=("$file")
fi
done
echo "Files to keep: ${files_to_keep[@]}"
echo "Files that would be removed: ${files_to_remove[@]}"
echo
echo "This script is in simulation mode and won't actually delete any files."
echo "In a real scenario, you would ask for confirmation before deletion."
Speichern Sie die Datei und machen Sie sie ausführbar:
chmod +x /home/labex/project/advanced_cleanup.sh
Führen Sie das erweiterte Skript mit verschiedenen Kombinationen von Erweiterungen aus:
./advanced_cleanup.sh /home/labex/project/test_files txt jpg
Dies identifiziert sowohl .txt- als auch .jpg-Dateien zur Entfernung.
Was wir getan haben
In dieser praktischen Übung haben wir:
- Eine Testumgebung mit verschiedenen Dateitypen erstellt
- Ein einfaches Skript erstellt, das Array-Filterung verwendet, um Dateien mit bestimmten Erweiterungen zu identifizieren
- Das Skript erweitert, um mehrere Dateierweiterungen zu verarbeiten
- Demonstriert, wie man Bash-Arrays in einem realen Szenario verwendet
Dieses Beispiel zeigt, wie die Array-Manipulationstechniken, die wir gelernt haben, auf praktische Probleme wie Dateiverwaltung und Bereinigungsaufgaben angewendet werden können. Die Fähigkeit, Arrays zu filtern, ist ein leistungsstarkes Werkzeug in Ihrem Bash-Skripting-Toolkit.