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 755chmod 755 script.shВладелец: всё; группа и остальные: чтение и выполнение.
chmod 640chmod 640 config.ymlВладелец читает и пишет, группа читает, остальные ничего.
chmod 600chmod 600 ~/.ssh/id_ed25519Только владелец. Для приватных ключей обязательно.
chmod 700chmod 700 ~/.sshПапка доступна только владельцу.
chmod u+xchmod u+x run.shДобавить право выполнения владельцу.
chmod go-wchmod go-w fileУбрать запись у группы и остальных.
chmod a+rchmod a+r report.pdfЧтение для всех.
chmod -Rchmod -R 750 /srv/appРекурсивно. Для файлов и папок права часто разные, см. пример ниже.
chmod g+schmod g+s /srv/sharedsetgid на папке: новые файлы получат группу папки.
chmod +tchmod +t /srv/dropSticky-бит: удалять файлы может только владелец файла (как /tmp).
chmod u+schmod u+s toolsetuid: программа работает с правами владельца. Используйте с осторожностью.
chmod --referencechmod --reference=a.sh b.shСкопировать права с другого файла.
chownchown ivan file.txtСменить владельца.
chown user:groupchown ivan:devs file.txtСменить владельца и группу.
chown -Rchown -R www-data:www-data /var/wwwРекурсивно сменить владельца.
chown --fromchown --from=1001 2001 -R /srv/dataМенять владельца только тем, кто имеет указанный UID.
chgrpchgrp devs project/Сменить только группу.
umaskumask 027Маска прав для новых файлов в текущей сессии (027 даёт 750 для папок и 640 для файлов).

Создание и копирование

КомандаВариантЧто делает
mkdirmkdir projectsСоздать папку.
mkdir -pmkdir -p app/{src,logs,config}Создать цепочку папок и без ошибки, если уже есть.
mkdir -mmkdir -m 750 secureСоздать с правами.
touchtouch note.txtСоздать пустой файл или обновить время изменения.
touch -dtouch -d "2026-01-01 12:00" fileЗадать конкретное время изменения.
cpcp a.txt b.txtКопировать файл.
cp -rcp -r src/ dst/Рекурсивно копировать папку.
cp -acp -a /etc /backup/etcАрхивный режим: права, владельцы, ссылки и время сохраняются.
cp -pcp -p config.yml config.bakСохранить права и время.
cp -icp -i a.txt b.txtСпросить перед перезаписью.
cp -ucp -ru src/ dst/Копировать только если источник новее.
cp -vcp -rv src/ dst/Показывать каждое скопированное.
mvmv old.txt new.txtПереименовать или переместить.
mv -nmv -n a.txt /backup/Не перезаписывать существующий файл.
mv -imv -i a.txt /backup/Спросить перед перезаписью.
mv -tmv -t /backup/ *.logУказать папку назначения первым аргументом (удобно с xargs).
renamerename 's/\.txt$/.md/' *.txtМассовое переименование по регулярному выражению (пакет perl-rename).

Удаление

КомандаВариантЧто делает
rmrm file.txtУдалить файл.
rm -irm -i *.tmpПодтверждать каждое удаление.
rm -rrm -r old_dir/Удалить папку с содержимым.
rm -frm -f maybe.txtНе спрашивать и не ругаться, если файла нет.
rm -rfrm -rf build/Жёсткое удаление без вопросов. Опасно, см. предупреждение.
rmdirrmdir empty_dirУдалить только пустую папку (безопасный вариант).
rmdir -prmdir -p a/b/cУдалить вложенные пустые папки по цепочке.
shredshred -u -n 3 secret.txtЗатереть данные перед удалением (на SSD и CoW-файловых системах эффект ограничен).

Ссылки

КомандаВариантЧто делает
ln -sln -s /opt/app/current/bin/app /usr/local/bin/appСимволическая ссылка.
ln -sfln -sfn /opt/app/v2 /opt/app/currentПерезаписать существующую ссылку. -n нужен, чтобы не заходить внутрь старой папки.
lnln original.txt hard.txtЖёсткая ссылка: тот же inode, работает только в одной файловой системе.
readlink -freadlink -f /usr/bin/python3Настоящий путь за цепочкой ссылок.
realpathrealpath ./dataАбсолютный путь с раскрытием ссылок.

Просмотр и информация

КомандаВариантЧто делает
ls -lls -lПодробный список с правами.
ls -lals -laВключая скрытые файлы.
ls -lhls -lh /var/logРазмеры в читаемом виде.
ls -ltls -ltСортировка по времени: новые сверху.
ls -lSls -lSСортировка по размеру: большие сверху.
ls -Rls -R project/Рекурсивно.
ls -dls -ld /tmpПоказать саму папку, а не её содержимое.
ls -ils -i fileПоказать номер inode.
statstat file.txtРазмер, inode, права, время доступа, изменения и создания.
filefile archive.binОпределяет тип файла по содержимому.
basenamebasename /var/log/syslogИмя файла без пути.
dirnamedirname /var/log/syslogПуть без имени файла.
du -shdu -sh /var/*Суммарный размер каждого элемента.
lsattr / chattrchattr +i critical.confАтрибут immutable: файл нельзя менять или удалить даже root, пока атрибут не снят (-i).

Поиск: find

КомандаВариантЧто делает
findfind . -name "*.log"Файлы по имени (с учётом регистра).
find -inamefind . -iname "readme*"Имя без учёта регистра.
find -typefind . -type d -name node_modulesТолько папки (f — файлы, l — ссылки).
find -sizefind / -size +500M 2>/dev/nullБольше 500 МБ. Суффиксы c, k, M, G.
find -mtimefind /var/log -mtime +30Изменены более 30 дней назад.
find -mminfind . -mmin -60Изменены за последние 60 минут.
find -newerfind . -newer ref.txtНовее эталонного файла.
find -userfind /srv -user ivanПринадлежат пользователю.
find -groupfind /srv -group devsПринадлежат группе.
find -permfind / -perm -4000 -type f 2>/dev/nullФайлы с setuid-битом (полезно для аудита).
find -emptyfind . -type d -emptyПустые папки.
find -maxdepthfind . -maxdepth 1 -type fНе заходить глубже указанного уровня.
find -execfind . -name "*.bak" -exec rm -v {} \;Выполнить команду для каждого результата (\; — по одному, + — пачками).
find -exec +find . -name "*.jpg" -exec chmod 644 {} +Передать много файлов одной командой, быстрее.
find -print0find . -name "*.tmp" -print0 | xargs -0 rm -fНулевой разделитель: безопасно для пробелов в именах.
find -deletefind /tmp -mtime +7 -deleteУдалить найденное. Сначала проверьте без -delete.
locatelocate nginx.confБыстрый поиск по базе (обновляется через updatedb).
which / typetype -a python3Где находится исполняемый файл и как он вызывается.

ACL: права для отдельных пользователей

КомандаВариантЧто делает
getfaclgetfacl 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 -msetfacl -R -m d:u:ivan:rwX /srv/sharedРекурсивно, с наследованием по умолчанию (d:) для новых файлов.
setfacl -xsetfacl -x u:ivan report.csvУдалить запись ACL.
setfacl -bsetfacl -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» при работе с вложенными файлами часто связана именно с этим.