mirror of
https://github.com/Direct-Dev-Ru/go-lcg.git
synced 2026-11-09 08:56:39 +00:00
55 lines
2.1 KiB
Bash
Executable File
55 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# lcg: нужен скрипт на bash который получит на вход два араметра корень поиска и поисковое выражение и проведет поиск по всем подпапкам начиная с указанной указанного поискового выражения и выведет все в файл указанный третьим параметром скрипта. поисковое выражение ищется как в именах файлов так и в контенте через grep отсекая бинарные файлы и прочее нетекстовое
|
||
# обновлено: 2026-10-21 18:23:18
|
||
set -euo pipefail
|
||
|
||
# Использование:
|
||
# ./search.sh <корень_поиска> <выражение> <файл_результата>
|
||
|
||
set -u
|
||
|
||
if [[ $# -ne 3 ]]; then
|
||
echo "Использование: $0 <корень_поиска> <выражение> <файл_результата>" >&2
|
||
exit 1
|
||
fi
|
||
|
||
root=$1
|
||
expr=$2
|
||
output=$3
|
||
|
||
if [[ ! -d "$root" ]]; then
|
||
echo "Ошибка: каталог не найден: $root" >&2
|
||
exit 1
|
||
fi
|
||
|
||
root=$(realpath -m -- "$root")
|
||
output=$(realpath -m -- "$output")
|
||
|
||
# Создаём или очищаем файл результата
|
||
: > "$output" || {
|
||
echo "Ошибка: невозможно записать в $output" >&2
|
||
exit 1
|
||
}
|
||
|
||
find "$root" -type f -print0 |
|
||
while IFS= read -r -d '' file; do
|
||
# Не искать внутри самого файла результатов
|
||
[[ "$file" == "$output" ]] && continue
|
||
|
||
# Поиск выражения в имени файла или полном пути
|
||
if grep -E -q -- "$expr" <<< "$file"; then
|
||
printf '[NAME] %s\n' "$file" >> "$output"
|
||
fi
|
||
|
||
# Поиск в содержимом.
|
||
# -I — игнорировать бинарные файлы
|
||
# -n — номер строки
|
||
# -H — имя файла
|
||
grep -I -nH -F -- "$expr" "$file" >> "$output" 2>/dev/null || true
|
||
done
|
||
|
||
echo "Результаты записаны в: $output"
|
||
|
||
|
||
|