rubric/modules/linuxmodules/linux_files.go
2026-07-21 14:52:55 +03:00

266 lines
16 KiB
Go
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package linuxmodules
import (
"fmt"
"rubric/utils"
)
var FilesModule = Module{
Key: "files",
Aliases: []string{"f", "dirs", "файлы"},
Title: "Файлы и директории",
Description: "Темы 0610: пути, cp/mv/rm, ссылки, чтение файлов, nano и vi",
Run: showFiles,
}
func showFiles() {
utils.Header("Linux — Файлы и директории")
// ─── 06. Пути и директории ────────────────────────────────────
utils.Section("06. Пути и директории")
utils.Println(utils.ColorBold + "Абсолютный и относительный пути:" + utils.ColorReset)
utils.Code(`Абсолютный: начинается с /
/home/user/documents/file.txt
Относительный: относительно текущей директории
documents/file.txt (из /home/user)
../другой/файл (.. — родительская директория)
./скрипт.sh (. — текущая директория)`)
utils.Println(utils.ColorBold + "Специальные обозначения:" + utils.ColorReset)
utils.Code(`. — текущая директория
.. — родительская директория
~ — домашняя директория текущего пользователя
~/ — то же самое, используется в путях: ~/docs
- — предыдущая директория (cd -)`)
utils.Println(utils.ColorBold + "Навигация:" + utils.ColorReset)
utils.Command("pwd", "показать текущую директорию (Print Working Directory)")
utils.Command("cd /etc", "перейти в /etc (абсолютный путь)")
utils.Command("cd docs", "перейти в docs (относительный)")
utils.Command("cd ..", "перейти в родительскую директорию")
utils.Command("cd ~", "перейти домой")
utils.Command("cd -", "вернуться в предыдущую директорию")
utils.Command("cd", "то же что cd ~")
fmt.Println()
utils.Println(utils.ColorBold + "Просмотр содержимого:" + utils.ColorReset)
utils.Command("ls", "список файлов текущей директории")
utils.Command("ls -l", "длинный формат (права, владелец, размер, дата)")
utils.Command("ls -a", "все файлы включая скрытые (начинаются с .)")
utils.Command("ls -la", "длинный формат + скрытые")
utils.Command("ls -lh", "размер в читаемом виде (K, M, G)")
utils.Command("ls -lt", "сортировка по времени (новые сверху)")
utils.Command("ls -ltr", "по времени в обратном порядке")
utils.Command("ls -R", "рекурсивно (все вложенные)")
utils.Command("ls /etc/*.conf", "glob-паттерн: все .conf в /etc")
fmt.Println()
utils.Code(`# Пример вывода ls -l:
drwxr-xr-x 2 alice users 4096 Jan 15 10:30 docs
-rw-r--r-- 1 alice users 512 Jan 14 09:00 file.txt
lrwxrwxrwx 1 alice users 7 Jan 13 12:00 link -> file.txt
│ │ │ │ │ │ │
│ │ │ │ │ │ └ имя файла
│ │ │ │ │ └ дата изменения
│ │ │ │ └ размер (байты)
│ │ │ └ группа
│ │ └ владелец
│ └ количество жёстких ссылок
└ тип и права доступа`)
utils.Println(utils.ColorBold + "Создание директорий:" + utils.ColorReset)
utils.Command("mkdir mydir", "создать директорию")
utils.Command("mkdir -p a/b/c", "создать вложенные директории")
utils.Command("mkdir -p project/{src,docs,tests}", "создать несколько сразу")
utils.Command("rmdir mydir", "удалить пустую директорию")
// ─── 07. Создание и копирование файлов ───────────────────────
utils.Section("07. Создание и копирование файлов")
utils.Println(utils.ColorBold + "Создание файлов:" + utils.ColorReset)
utils.Command("touch file.txt", "создать пустой файл / обновить время доступа")
utils.Command("touch file{1..5}.txt", "создать file1.txt … file5.txt")
utils.Command("> file.txt", "создать пустой файл / очистить существующий")
utils.Command("echo 'текст' > file.txt", "записать текст в файл")
utils.Command("echo 'текст' >> file.txt", "добавить текст в конец файла")
fmt.Println()
utils.Println(utils.ColorBold + "Копирование (cp):" + utils.ColorReset)
utils.Command("cp src dst", "скопировать файл")
utils.Command("cp -r src/ dst/", "скопировать директорию рекурсивно")
utils.Command("cp -v src dst", "показать что копируется (-v = verbose)")
utils.Command("cp -i src dst", "спросить при перезаписи (-i = interactive)")
utils.Command("cp -p src dst", "сохранить права/метаданные (-p = preserve)")
utils.Command("cp -a src/ dst/", "архивный режим: -r + -p + символические ссылки")
utils.Command("cp *.txt /tmp/", "копировать все .txt в /tmp")
fmt.Println()
utils.Note("cp -r не сохраняет права и время по умолчанию. Для резервного копирования используйте cp -a.")
// ─── 08. Перемещение, удаление, ссылки ───────────────────────
utils.Section("08. Перемещение, переименование, удаление. Ссылки")
utils.Println(utils.ColorBold + "Перемещение и переименование (mv):" + utils.ColorReset)
utils.Command("mv old.txt new.txt", "переименовать файл")
utils.Command("mv file.txt /tmp/", "переместить в /tmp")
utils.Command("mv -v src dst", "подробный вывод")
utils.Command("mv -i src dst", "спросить при перезаписи")
utils.Command("mv -n src dst", "не перезаписывать существующий")
fmt.Println()
utils.Println(utils.ColorBold + "Удаление (rm):" + utils.ColorReset)
utils.Command("rm file.txt", "удалить файл")
utils.Command("rm -r dir/", "удалить директорию рекурсивно")
utils.Command("rm -rf dir/", "принудительно, без подтверждений")
utils.Command("rm -i file.txt", "спросить перед удалением")
utils.Command("rm -v file.txt", "показать что удаляется")
fmt.Println()
utils.Note("rm -rf удаляет безвозвратно. Нет корзины. Будьте внимательны!")
utils.Code(`# Защита: никогда не делайте:
rm -rf / # удалит всю систему
rm -rf ./ # удалит текущую директорию
# Безопаснее: перенести в /tmp, потом удалить
mv dangerous_dir /tmp/ && rm -rf /tmp/dangerous_dir`)
utils.Println(utils.ColorBold + "Жёсткие ссылки (hard links):" + utils.ColorReset)
utils.Code(`Жёсткая ссылка — ещё одно имя для того же inode.
ln file.txt hardlink.txt # создать жёсткую ссылку
Особенности:
- указывает на те же данные на диске
- не отличить от оригинала командой ls
- удаление одного имени не удаляет данные
(данные удаляются когда счётчик ссылок = 0)
- нельзя создать на директорию
- нельзя создать на другой раздел/диске`)
utils.Println(utils.ColorBold + "Символические ссылки (soft links / symlinks):" + utils.ColorReset)
utils.Code(`Символическая ссылка — файл, содержащий путь к цели.
ln -s /etc/nginx/nginx.conf nginx.conf # создать симлинк
ln -s /path/to/dir mylink # симлинк на директорию
ls -la nginx.conf
# lrwxrwxrwx 1 user group 20 Jan nginx.conf -> /etc/nginx/nginx.conf
Особенности:
- показывается как l в ls -la
- может указывать на директории
- может быть "битым" (цель удалена)
- можно создать между разными разделами
- readlink nginx.conf — показать куда указывает`)
utils.Command("stat file.txt", "показать подробную информацию о файле (inode, ссылки)")
utils.Command("ls -i file.txt", "показать номер inode")
// ─── 09. Чтение текстовых файлов ─────────────────────────────
utils.Section("09. Чтение текстовых файлов")
utils.Command("cat file.txt", "вывести весь файл")
utils.Command("cat -n file.txt", "с номерами строк")
utils.Command("cat -A file.txt", "показать спецсимволы ($ в конце строк)")
utils.Command("cat f1 f2 > merged", "объединить файлы")
fmt.Println()
utils.Command("less file.txt", "постраничный просмотр (рекомендуется для больших файлов)")
utils.Command("more file.txt", "постраничный просмотр (только вперёд)")
fmt.Println()
utils.Code(`Навигация в less:
Space / PgDn — следующая страница
b / PgUp — предыдущая страница
g / G — начало / конец файла
/паттерн — поиск вперёд
?паттерн — поиск назад
n / N — следующее / предыдущее совпадение
q — выход`)
utils.Command("head file.txt", "первые 10 строк")
utils.Command("head -n 20 file.txt", "первые 20 строк")
utils.Command("head -c 100 file.txt", "первые 100 байт")
utils.Command("tail file.txt", "последние 10 строк")
utils.Command("tail -n 30 file.txt", "последние 30 строк")
utils.Command("tail -f /var/log/syslog", "следить за файлом в реальном времени")
utils.Command("tail -F /var/log/nginx/access.log", "следить, даже если файл пересоздаётся")
fmt.Println()
utils.Command("grep 'текст' file.txt", "поиск строк содержащих 'текст'")
utils.Command("grep -i 'TEXT' file.txt", "без учёта регистра")
utils.Command("grep -r 'текст' /etc/", "рекурсивный поиск в директории")
utils.Command("grep -n 'текст' file.txt", "с номерами строк")
utils.Command("grep -v 'текст' file.txt", "строки НЕ содержащие 'текст'")
utils.Command("grep -c 'текст' file.txt", "количество совпадений")
utils.Command("grep -l 'текст' *.conf", "только имена файлов с совпадениями")
fmt.Println()
utils.Command("wc file.txt", "количество строк, слов, байт")
utils.Command("wc -l file.txt", "только строки")
utils.Command("wc -w file.txt", "только слова")
utils.Command("sort file.txt", "сортировать строки")
utils.Command("sort -r file.txt", "в обратном порядке")
utils.Command("sort -n file.txt", "числовая сортировка")
utils.Command("sort -u file.txt", "убрать дубли (unique)")
utils.Command("uniq file.txt", "убрать соседние одинаковые строки")
utils.Command("cut -d: -f1 /etc/passwd", "вырезать первое поле (разделитель :)")
utils.Command("cut -d, -f2,4 data.csv", "поля 2 и 4 из CSV")
utils.Command("tr 'a-z' 'A-Z' < file.txt", "заменить символы (нижний → верхний регистр)")
utils.Command("diff file1 file2", "сравнить два файла")
utils.Command("diff -u file1 file2", "unified-формат (как git diff)")
// ─── 10. Текстовые редакторы ──────────────────────────────────
utils.Section("10. Текстовые редакторы: nano и vi/vim")
utils.Println(utils.ColorBold + "nano — простой редактор:" + utils.ColorReset)
utils.Command("nano file.txt", "открыть файл в nano")
utils.Code(`Основные сочетания клавиш в nano:
Ctrl+O — сохранить (Write Out)
Ctrl+X — выйти
Ctrl+K — вырезать строку
Ctrl+U — вставить
Ctrl+W — поиск
Ctrl+\ — замена
Ctrl+G — справка
Alt+U — отменить (undo)`)
utils.Println(utils.ColorBold + "vi / vim — мощный редактор:" + utils.ColorReset)
utils.Command("vi file.txt", "открыть в vi")
utils.Command("vim file.txt", "открыть в vim (улучшенный vi)")
fmt.Println()
utils.Code(`Режимы vim:
Нормальный (Normal) — навигация, команды. По умолчанию.
Вставки (Insert) — ввод текста. Нажать i.
Командный (Command) — команды (:). Нажать :
Визуальный (Visual) — выделение. Нажать v.
Переключение:
i — режим вставки перед курсором
a — режим вставки после курсора
o — новая строка ниже, режим вставки
O — новая строка выше, режим вставки
Esc — вернуться в нормальный режим`)
utils.Code(`Навигация (нормальный режим):
h j k l — ← ↓ ↑ →
w / b — следующее / предыдущее слово
0 / $ — начало / конец строки
gg / G — начало / конец файла
:n — перейти на строку n
Ctrl+F/B — вперёд / назад на страницу
Редактирование:
dd — удалить строку
yy — скопировать строку (yank)
p — вставить после курсора
P — вставить перед курсором
u — отменить (undo)
Ctrl+R — повторить (redo)
/текст — поиск вперёд
n / N — следующее / предыдущее совпадение
:%s/old/new/g — заменить все вхождения
Сохранение и выход:
:w — сохранить
:q — выйти
:wq или ZZ — сохранить и выйти
:q! — выйти без сохранения
:wq! — принудительно сохранить и выйти`)
utils.Note("Если застряли в vi — нажмите Esc несколько раз, затем :q! для выхода без сохранения.")
utils.Note("vimtutor — встроенный интерактивный учебник по vim (30 мин). Запустите в терминале.")
utils.Footer()
}