266 lines
16 KiB
Go
Executable file
266 lines
16 KiB
Go
Executable file
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()
|
||
}
|