Linux: файлы, каталоги, ссылки и права доступа
Копирование, перемещение, удаление, поиск и управление правами файлов и папок
Права доступа: как читать
-rwxr-x--- 1 ivan devs 4096 Oct 17 10:00 deploy.sh
│├─┤├─┤├─┤
│ │ │ └── others (остальные)
│ │ └───── group (группа)
│ └──────── owner (владелец)
└────────── тип: - файл, d папка, l символическая ссылка
r = 4 (чтение), w = 2 (запись), x = 1 (выполнение)
Для папки: r — видеть список, w — создавать и удалять, x — входить в неё
| Команда | Вариант | Что делает |
| chmod 755 | chmod 755 script.sh | Владелец: всё; группа и остальные: чтение и выполнение. |
| chmod 640 | chmod 640 config.yml | Владелец читает и пишет, группа читает, остальные ничего. |
| chmod 600 | chmod 600 ~/.ssh/id_ed25519 | Только владелец. Для приватных ключей обязательно. |
| chmod 700 | chmod 700 ~/.ssh | Папка доступна только владельцу. |
| chmod u+x | chmod u+x run.sh | Добавить право выполнения владельцу. |
| chmod go-w | chmod go-w file | Убрать запись у группы и остальных. |
| chmod a+r | chmod a+r report.pdf | Чтение для всех. |
| chmod -R | chmod -R 750 /srv/app | Рекурсивно. Для файлов и папок права часто разные, см. пример ниже. |
| chmod g+s | chmod g+s /srv/shared | setgid на папке: новые файлы получат группу папки. |
| chmod +t | chmod +t /srv/drop | Sticky-бит: удалять файлы может только владелец файла (как /tmp). |
| chmod u+s | chmod u+s tool | setuid: программа работает с правами владельца. Используйте с осторожностью. |
| chmod --reference | chmod --reference=a.sh b.sh | Скопировать права с другого файла. |
| chown | chown ivan file.txt | Сменить владельца. |
| chown user:group | chown ivan:devs file.txt | Сменить владельца и группу. |
| chown -R | chown -R www-data:www-data /var/www | Рекурсивно сменить владельца. |
| chown --from | chown --from=1001 2001 -R /srv/data | Менять владельца только тем, кто имеет указанный UID. |
| chgrp | chgrp devs project/ | Сменить только группу. |
| umask | umask 027 | Маска прав для новых файлов в текущей сессии (027 даёт 750 для папок и 640 для файлов). |
Создание и копирование
| Команда | Вариант | Что делает |
| mkdir | mkdir projects | Создать папку. |
| mkdir -p | mkdir -p app/{src,logs,config} | Создать цепочку папок и без ошибки, если уже есть. |
| mkdir -m | mkdir -m 750 secure | Создать с правами. |
| touch | touch note.txt | Создать пустой файл или обновить время изменения. |
| touch -d | touch -d "2026-01-01 12:00" file | Задать конкретное время изменения. |
| cp | cp a.txt b.txt | Копировать файл. |
| cp -r | cp -r src/ dst/ | Рекурсивно копировать папку. |
| cp -a | cp -a /etc /backup/etc | Архивный режим: права, владельцы, ссылки и время сохраняются. |
| cp -p | cp -p config.yml config.bak | Сохранить права и время. |
| cp -i | cp -i a.txt b.txt | Спросить перед перезаписью. |
| cp -u | cp -ru src/ dst/ | Копировать только если источник новее. |
| cp -v | cp -rv src/ dst/ | Показывать каждое скопированное. |
| mv | mv old.txt new.txt | Переименовать или переместить. |
| mv -n | mv -n a.txt /backup/ | Не перезаписывать существующий файл. |
| mv -i | mv -i a.txt /backup/ | Спросить перед перезаписью. |
| mv -t | mv -t /backup/ *.log | Указать папку назначения первым аргументом (удобно с xargs). |
| rename | rename 's/\.txt$/.md/' *.txt | Массовое переименование по регулярному выражению (пакет perl-rename). |
Удаление
| Команда | Вариант | Что делает |
| rm | rm file.txt | Удалить файл. |
| rm -i | rm -i *.tmp | Подтверждать каждое удаление. |
| rm -r | rm -r old_dir/ | Удалить папку с содержимым. |
| rm -f | rm -f maybe.txt | Не спрашивать и не ругаться, если файла нет. |
| rm -rf | rm -rf build/ | Жёсткое удаление без вопросов. Опасно, см. предупреждение. |
| rmdir | rmdir empty_dir | Удалить только пустую папку (безопасный вариант). |
| rmdir -p | rmdir -p a/b/c | Удалить вложенные пустые папки по цепочке. |
| shred | shred -u -n 3 secret.txt | Затереть данные перед удалением (на SSD и CoW-файловых системах эффект ограничен). |
Ссылки
| Команда | Вариант | Что делает |
| ln -s | ln -s /opt/app/current/bin/app /usr/local/bin/app | Символическая ссылка. |
| ln -sf | ln -sfn /opt/app/v2 /opt/app/current | Перезаписать существующую ссылку. -n нужен, чтобы не заходить внутрь старой папки. |
| ln | ln original.txt hard.txt | Жёсткая ссылка: тот же inode, работает только в одной файловой системе. |
| readlink -f | readlink -f /usr/bin/python3 | Настоящий путь за цепочкой ссылок. |
| realpath | realpath ./data | Абсолютный путь с раскрытием ссылок. |
Просмотр и информация
| Команда | Вариант | Что делает |
| ls -l | ls -l | Подробный список с правами. |
| ls -la | ls -la | Включая скрытые файлы. |
| ls -lh | ls -lh /var/log | Размеры в читаемом виде. |
| ls -lt | ls -lt | Сортировка по времени: новые сверху. |
| ls -lS | ls -lS | Сортировка по размеру: большие сверху. |
| ls -R | ls -R project/ | Рекурсивно. |
| ls -d | ls -ld /tmp | Показать саму папку, а не её содержимое. |
| ls -i | ls -i file | Показать номер inode. |
| stat | stat file.txt | Размер, inode, права, время доступа, изменения и создания. |
| file | file archive.bin | Определяет тип файла по содержимому. |
| basename | basename /var/log/syslog | Имя файла без пути. |
| dirname | dirname /var/log/syslog | Путь без имени файла. |
| du -sh | du -sh /var/* | Суммарный размер каждого элемента. |
| lsattr / chattr | chattr +i critical.conf | Атрибут immutable: файл нельзя менять или удалить даже root, пока атрибут не снят (-i). |
Поиск: find
| Команда | Вариант | Что делает |
| find | find . -name "*.log" | Файлы по имени (с учётом регистра). |
| find -iname | find . -iname "readme*" | Имя без учёта регистра. |
| find -type | find . -type d -name node_modules | Только папки (f — файлы, l — ссылки). |
| find -size | find / -size +500M 2>/dev/null | Больше 500 МБ. Суффиксы c, k, M, G. |
| find -mtime | find /var/log -mtime +30 | Изменены более 30 дней назад. |
| find -mmin | find . -mmin -60 | Изменены за последние 60 минут. |
| find -newer | find . -newer ref.txt | Новее эталонного файла. |
| find -user | find /srv -user ivan | Принадлежат пользователю. |
| find -group | find /srv -group devs | Принадлежат группе. |
| find -perm | find / -perm -4000 -type f 2>/dev/null | Файлы с setuid-битом (полезно для аудита). |
| find -empty | find . -type d -empty | Пустые папки. |
| find -maxdepth | find . -maxdepth 1 -type f | Не заходить глубже указанного уровня. |
| find -exec | find . -name "*.bak" -exec rm -v {} \; | Выполнить команду для каждого результата (\; — по одному, + — пачками). |
| find -exec + | find . -name "*.jpg" -exec chmod 644 {} + | Передать много файлов одной командой, быстрее. |
| find -print0 | find . -name "*.tmp" -print0 | xargs -0 rm -f | Нулевой разделитель: безопасно для пробелов в именах. |
| find -delete | find /tmp -mtime +7 -delete | Удалить найденное. Сначала проверьте без -delete. |
| locate | locate nginx.conf | Быстрый поиск по базе (обновляется через updatedb). |
| which / type | type -a python3 | Где находится исполняемый файл и как он вызывается. |
ACL: права для отдельных пользователей
| Команда | Вариант | Что делает |
| getfacl | getfacl report.csv | Показать ACL файла. |
| setfacl -m u:имя | setfacl -m u:ivan:rw report.csv | Дать пользователю ivan чтение и запись. |
| setfacl -m g:имя | setfacl -m g:auditors:r-x /srv/logs | Дать группе чтение и обход. |
| setfacl -R -m | setfacl -R -m d:u:ivan:rwX /srv/shared | Рекурсивно, с наследованием по умолчанию (d:) для новых файлов. |
| setfacl -x | setfacl -x u:ivan report.csv | Удалить запись ACL. |
| setfacl -b | setfacl -b report.csv | Удалить все ACL. |
Пример: правильные права для веб-папки
# Папки 755, файлы 644 (чтобы веб-сервер читал)
find /var/www/site -type d -exec chmod 755 {} +
find /var/www/site -type f -exec chmod 644 {} +
# Скрипты, которые нужно запускать
chmod 755 /var/www/site/bin/*.sh
# Владелец и группа
chown -R deploy:www-data /var/www/site
# Конфиг с паролями доступен только владельцу и группе
chmod 640 /var/www/site/config/.env
rm -rf, chmod -R и chown -R применяются ко всему дереву, включая случайно попавшие пути. Сначала выполните ls или find с теми же условиями, и только потом меняйте. Никогда не запускайте chmod -R 777 как «быстрое решение»: это открывает запись всем пользователям системы.
Для права на папку важен бит x: без него нельзя зайти в каталог, даже если есть чтение. Ошибка «Permission denied» при работе с вложенными файлами часто связана именно с этим.