Exercício Prático: Construindo um Script de Limpeza de Arquivos
Agora que você entende os diferentes métodos para remover elementos de arrays Bash, vamos aplicar esse conhecimento a uma situação prática. Criaremos um script que ajuda a limpar um diretório, filtrando tipos de arquivos específicos.
O Desafio da Limpeza de Arquivos
Imagine que você tem um diretório contendo vários tipos de arquivos (arquivos de texto, imagens, documentos) e deseja remover seletivamente certos tipos de arquivos. Usaremos um array Bash para gerenciar esses arquivos e aplicar nosso conhecimento de filtragem de arrays.
Primeiro, vamos criar um diretório de teste com alguns arquivos de amostra. Abra seu terminal e execute:
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
Verifique se os arquivos foram criados:
ls -la
Você deve ver a lista de arquivos de amostra que acabamos de criar.
Passo 2: Crie o Script de Limpeza de Arquivos
Agora, vamos criar nosso script que usará operações de array para filtrar arquivos. Crie um novo arquivo chamado cleanup_files.sh no diretório /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"
Salve o arquivo e torne-o executável:
chmod +x /home/labex/project/cleanup_files.sh
Passo 3: Execute o Script de Limpeza de Arquivos
Agora, vamos executar nosso script para ver como ele identifica e filtra arquivos:
./cleanup_files.sh
Isso deve mostrar a saída indicando quais arquivos seriam removidos (aqueles com a extensão .txt).
Experimente com diferentes extensões de arquivo:
./cleanup_files.sh /home/labex/project/test_files pdf
Isso mostrará os arquivos com a extensão .pdf como os que seriam removidos.
Passo 4: Aprimore o Script com Processamento em Lote
Vamos aprimorar nosso script para lidar com várias extensões de arquivo de uma vez. Crie um novo arquivo chamado advanced_cleanup.sh no diretório /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."
Salve o arquivo e torne-o executável:
chmod +x /home/labex/project/advanced_cleanup.sh
Execute o script avançado com diferentes combinações de extensões:
./advanced_cleanup.sh /home/labex/project/test_files txt jpg
Isso identificará os arquivos .txt e .jpg para remoção.
Entendendo o que Fizemos
Neste exercício prático, nós:
- Criamos um ambiente de teste com vários tipos de arquivos
- Construímos um script básico que usa a filtragem de array para identificar arquivos com extensões específicas
- Aprimoramos o script para lidar com várias extensões de arquivo
- Demonstramos como usar arrays Bash em um cenário do mundo real
Este exemplo mostra como as técnicas de manipulação de array que aprendemos podem ser aplicadas a problemas práticos, como gerenciamento de arquivos e tarefas de limpeza. A capacidade de filtrar arrays é uma ferramenta poderosa em seu kit de ferramentas de script Bash.