Пример кода Bash: Поиск больших файлов на удалённых серверах
Поиск больших файлов на удалённых серверах:
#!/bin/bash
###########################################################
# LARGE FILES TO DELETE ON FS FOR LINUX SYSTEM #
# created by #
# info - #
# run sh big.sh 1.txt** #
###########################################################
#VARS
INPUT_FILE=$1
OUTPUT_FILE="$HOME/list_packages.txt"
ERROR_HOSTS_FILE="$HOME/$0_ssh_error_hosts.txt"
#FAQ
function usage {
echo "Usage:"
echo "$(basename $0) hosts.txt"
echo "The file hosts.txt should be filled with hostnames or IP addresses, each entry on a separate line. The name of the host list file can be anything."
}
if [[ $# -eq 0 ]]
then
usage
fi
#Processing errors
process_error() {
echo $1 >> $ERROR_HOSTS_FILE
echo "ERROR $1: $2" >&2
}
echo "Найденные файлы" > $OUTPUT_FILE
echo -n > $ERROR_HOSTS_FILE
#main CYCLE
while IFS= read -r server; do
echo "Processing $server..."
temp_file=$(mktemp)
ssh -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no USER@"$server" /bin/bash << 'EOF' 2>> $HOME/$0-errors.log > "$temp_file"
HOSTNAME=$(hostname)
echo
echo "Расположение 10 папок, занимающих больше всего места"
sudo du /srv -ahx | sort -rh | head -10
echo
echo "Расположение default_profile"
sudo find /srv -type d -iname default_profile
echo
echo "Расположение iso"
sudo find /srv -type f -iname "*.iso"
echo
echo "Расположение tib"
sudo find /srv -type f -iname "*.tib"
echo
echo "Расположение nsf"
sudo find /srv -type f -iname "*.nsf"
echo
echo "Расположение *mail.db"
sudo find /srv -type f -iname "*mail.db" | xargs -r -d '\n' ls -lh
echo
echo "Расположение файлов размером >5ГБ"
sudo find /srv -type f -size +5G | xargs -r -d '\n' ls -lh
echo
echo "Расположение файлов размером от 3ГБ до 5ГБ"
sudo find /srv -size +3G -size -5G | xargs -r -d '\n' ls -lh
echo
echo "Расположение файлов размером от 1ГБ до 3ГБ"
sudo find /srv -size +1G -size -3G | xargs -r -d '\n' ls -lh
echo
echo "Расположение папок, которые не открывали больше 5000 дней"
sudo find /srv -type d -maxdepth 6 -mtime +5000 -mtime -6000
EOF
if [ $? -eq 0 ]; then
cat "$temp_file" >> "$OUTPUT_FILE"
else
process_error "$server" "SSH connection failed"
fi
rm -f "$temp_file"
done < "$INPUT_FILE"
echo "Result save to $OUTPUT_FILE"
Пояснения к элементам кода Bash
- #VARS — комментарий, обозначающий блок объявления переменных.
- INPUT_FILE=$1 — присваивание первого аргумента командной строки переменной
INPUT_FILE(файл со списком хостов). - OUTPUT_FILE="$HOME/list_packages.txt" — путь к файлу результатов (в домашней директории пользователя).
- ERROR_HOSTS_FILE="$HOME/$0_ssh_error_hosts.txt" — файл для записи хостов, к которым не удалось подключиться;
$0— имя текущего скрипта. - function usage — объявление функции, выводящей инструкцию по использованию скрипта.
- $(basename $0) — извлекает имя скрипта без пути.
- [[ $# -eq 0 ]] — проверка, переданы ли аргументы скрипту (
$#— количество аргументов;-eq 0— равно нулю). - process_error() — функция обработки ошибок: записывает имя хоста в файл ошибок и выводит сообщение об ошибке в
stderr. - > $OUTPUT_FILE — перезаписывает файл результатов (создаёт или очищает).
- > $ERROR_HOSTS_FILE — очищает файл ошибок перед началом работы.
- while IFS= read -r server; do — цикл чтения файла построчно;
IFS=отключает разделение строк на поля,-rсохраняет обратные слеши как обычные символы. - mktemp — создаёт временный файл и возвращает его путь.
- ssh -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no — подключение к хосту:
-q— тихий режим (без лишних сообщений);ConnectTimeout=10— таймаут подключения 10 секунд;StrictHostKeyChecking=no— отключение проверки ключа хоста.
- << 'EOF' — здесь‑документ (heredoc): передаёт блок команд на удалённый хост через
ssh; кавычки вокругEOFпредотвращают подстановку переменных на локальной машине. - HOSTNAME=$(hostname) — получает имя хоста на удалённой машине.
- sudo du /srv -ahx | sort -rh | head -10 — находит 10 самых больших папок в
/srv:du -ahx— размер всех файлов и папок (человеко‑читаемый формат, без перехода на другие файловые системы);sort -rh— сортировка по убыванию размера;head -10— первые 10 строк.
- sudo find /srv -type d -iname default_profile — ищет папки с именем
default_profileбез учёта регистра (-iname). - sudo find /srv -type f -iname "*.iso" — ищет файлы с расширением
.iso. - xargs -r -d '\n' — передаёт найденные пути в
ls -lh(-rне выполняет команду, если нет входных данных;-d '\n'использует перевод строки как разделитель). - find /srv -size +5G — файлы размером больше 5 ГБ.
- find /srv -size +3G -size -5G — файлы от 3 ГБ до 5 ГБ.
- find /srv -maxdepth 6 -mtime +5000 -mtime -6000 — папки, не изменявшиеся от 5 000 до 6 000 дней (
maxdepth 6ограничивает глубину поиска). - [ $? -eq 0 ] — проверяет код возврата предыдущей команды (
0означает успех). - cat "$temp_file" >> "$OUTPUT_FILE" — добавляет содержимое временного файла в итоговый отчёт.
- rm -f "$temp_file" — удаляет временный файл (
-fподавляет ошибки, если файл уже удалён). - done < "$INPUT_FILE" — завершение цикла чтения из файла со списком хостов.
- echo "Result save to $OUTPUT_FILE" — финальное сообщение о сохранении результата.
Полезные команды Bash
chmod +x script.sh— сделать скрипт исполняемым../script.sh— запустить скрипт.bash script.sh— запустить скрипт через интерпретатор Bash.cat script.sh— просмотреть содержимое скрипта.nano script.sh— отредактировать скрипт в текстовом редакторе.ps aux | grep bash— найти запущенные процессы Bash.history— показать историю выполненных команд.