package linuxmodules import ( "fmt" "rubric/utils" ) var FilesModule = Module{ Key: "files", Aliases: []string{"f", "dirs", "файлы"}, Title: "Файлы и директории", Description: "Темы 06–10: пути, 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() }