Практическое упражнение: Создание скрипта очистки файлов
Теперь, когда вы понимаете различные методы удаления элементов из массивов Bash, давайте применим эти знания на практике. Мы создадим скрипт, который поможет очистить каталог, отфильтровывая определенные типы файлов.
Задача очистки файлов
Представьте, что у вас есть каталог, содержащий различные типы файлов (текстовые файлы, изображения, документы), и вы хотите выборочно удалить определенные типы файлов. Мы будем использовать массив Bash для управления этими файлами и применять наши знания фильтрации массивов.
Шаг 1: Настройка тестового каталога с образцами файлов
Сначала давайте создадим тестовый каталог с некоторыми образцами файлов. Откройте свой терминал и запустите:
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
Убедитесь, что файлы были созданы:
ls -la
Вы должны увидеть список образцов файлов, которые мы только что создали.
Шаг 2: Создание скрипта очистки файлов
Теперь давайте создадим наш скрипт, который будет использовать операции с массивами для фильтрации файлов. Создайте новый файл с именем cleanup_files.sh в каталоге /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"
Сохраните файл и сделайте его исполняемым:
chmod +x /home/labex/project/cleanup_files.sh
Шаг 3: Запуск скрипта очистки файлов
Теперь давайте запустим наш скрипт, чтобы увидеть, как он идентифицирует и фильтрует файлы:
./cleanup_files.sh
Это должно показать вывод, указывающий, какие файлы будут удалены (те, что с расширением .txt).
Попробуйте с разными расширениями файлов:
./cleanup_files.sh /home/labex/project/test_files pdf
Это покажет файлы с расширением .pdf как те, которые будут удалены.
Шаг 4: Улучшение скрипта с пакетной обработкой
Давайте улучшим наш скрипт, чтобы он обрабатывал несколько расширений файлов одновременно. Создайте новый файл с именем advanced_cleanup.sh в каталоге /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."
Сохраните файл и сделайте его исполняемым:
chmod +x /home/labex/project/advanced_cleanup.sh
Запустите расширенный скрипт с разными комбинациями расширений:
./advanced_cleanup.sh /home/labex/project/test_files txt jpg
Это идентифицирует файлы .txt и .jpg для удаления.
Понимание того, что мы сделали
В этом практическом упражнении мы:
- Создали тестовую среду с различными типами файлов
- Создали базовый скрипт, который использует фильтрацию массивов для идентификации файлов с определенными расширениями
- Улучшили скрипт для обработки нескольких расширений файлов
- Продемонстрировали, как использовать массивы Bash в реальном сценарии
Этот пример показывает, как методы манипулирования массивами, которые мы изучили, могут быть применены к практическим задачам, таким как управление файлами и задачи очистки. Возможность фильтрации массивов — мощный инструмент в вашем наборе инструментов для написания сценариев Bash.