Файлы Linux: создать, скопировать, переименовать и связать
Автор: Казачкин Даниил Михайлович · Обновлено
Файловые операции отличаются по эффекту: touch меняет временные отметки, cp создаёт копию, mv меняет путь, ln добавляет ссылку, rm удаляет имя. Сначала разберём их на отдельных учебных данных. Команды рассчитаны на GNU Coreutils и Bash.
Создание файлов и каталогов
file_lab=$(mktemp -d)
mkdir -p "$file_lab/source" "$file_lab/copies"
touch "$file_lab/source/empty.txt"
touch "$file_lab/source"/{one,two,three}.txt
printf '%s\n' alpha beta >"$file_lab/source/report.txt"
truncate -s 1M "$file_lab/source/sparse.bin"
stat -c '%n: size=%s bytes, links=%h, inode=%i' "$file_lab/source/report.txt"report.txt содержит 11 байт: две строки с переводами строк. Touch создаёт отсутствующий файл, но существующий не обнуляет. Перенаправление > создаёт файл либо усекает существующий; >> дописывает. mkdir -p создаёт недостающих родителей. Фигурные скобки раскрывает Bash до запуска touch.
Файл sparse.bin имеет логический размер 1 MiB, но может занимать меньше блоков: truncate не обязан физически записывать нули. Такой файл подходит для эксперимента с размером, но не является готовым swap-файлом и не проверяет скорость записи диска. Сравните ls -lh и du -h.
Копирование, перемещение и метаданные
cp -p -- "$file_lab/source/report.txt" "$file_lab/copies/report.txt"
cp -a -- "$file_lab/source" "$file_lab/copies/snapshot"
mv -i -- "$file_lab/copies/report.txt" "$file_lab/copies/renamed.txt"
stat -c '%U:%G mode=%a %n' "$file_lab/copies/renamed.txt"cp -p пытается сохранить режим, владельца и времена в пределах прав пользователя; cp -a копирует дерево с набором атрибутов. Проверяйте stderr и нужные metadata, особенно ACL/xattrs, владельцев и ссылки между разными файловыми системами. Права destination и возможности носителя могут не позволить точную копию.
mv внутри одной файловой системы обычно переименовывает объект; между разными файловыми системами операция включает копирование и удаление источника и не равнозначна атомарному rename. Флаг -i спрашивает о перезаписи, а -- завершает разбор опций. В Midnight Commander переименование выполняют через F6 с новым именем назначения; результат всё равно стоит проверить по пути.
Для копирования на другой компьютер применяют scp/rsync из отдельного урока: локальная команда cp не начинает SSH-соединение. При подозрении на повреждённую копию USB сравните контрольные суммы, дождитесь завершения записи и корректного размонтирования. Совпавшие имена и размеры не доказывают совпадение байтов.
Hardlink, symlink и тип файла
ln -- "$file_lab/source/report.txt" "$file_lab/source/report-hard.txt"
ln -s report.txt "$file_lab/source/report-link.txt"
ls -li "$file_lab/source"/report*
stat -c '%F %i %h %n' "$file_lab/source"/report*
file "$file_lab/source/report.txt"
readlink "$file_lab/source/report-link.txt"У hardlink общий inode с исходным именем в той же файловой системе. Удаление одного имени не удаляет данные, пока остаются другие ссылки или открытые дескрипторы. Hardlink на каталог обычному пользователю не создают; через границу файловых систем он не работает.
Symlink — отдельный объект с текстом пути; он может указывать на каталог, другой том или пока отсутствующий объект. Относительная цель report.txt разрешается от каталога самой ссылки, не от текущего pwd. ln -s source "$file_lab/source-link" создаёт ссылку на учебный каталог. После удаления цели symlink останется, но обращение к цели завершится ошибкой.
ls -l и stat показывают тип объекта: обычный файл, каталог, ссылка, FIFO, сокет или устройство. file пытается определить формат по содержимому и признакам: расширение .txt само по себе ничего не гарантирует. stat по умолчанию описывает symlink; stat -L — цель. basename выделяет последний компонент пути, dirname — родительскую часть, не проверяя наличие объекта.
Массовое переименование расширений без перезаписи
Для набора .txt → .md подготовьте отдельный каталог и сначала проверьте все назначения:
mkdir "$file_lab/rename"
touch "$file_lab/rename/one.txt" "$file_lab/rename/two words.txt"
(
shopt -s nullglob
paths=("$file_lab/rename/"*.txt)
for source in "${paths[@]}"; do
target=${source%.txt}.md
if [[ -e "$target" || -L "$target" ]]; then
printf 'collision: %s\n' "$target" >&2
exit 1
fi
printf '%s -> %s\n' "$source" "$target"
done
for source in "${paths[@]}"; do
mv -n -- "$source" "${source%.txt}.md" || exit
[[ ! -e "$source" ]] || exit 1
done
)
ls -1 "$file_lab/rename"Ожидаются one.md и two words.md. Массив сохраняет пробелы, nullglob даёт пустой набор при отсутствии совпадений, проверка -L замечает и повреждённую ссылку назначения. mv -n не перезапишет внезапно появившуюся цель; последующая проверка замечает пропуск. Операция над набором не атомарна: выполняйте её в собственном каталоге без параллельных изменений. Для проверки отказа заранее создайте one.md: первый проход должен остановиться до любого переименования.
Общий каталог и ярлык приложения
Локальный общий каталог требует назначенной группы, прав и, при необходимости, setgid/default ACL; это [тема пользователей и доступа](/lessons/without-university/linux-developer-foundations/linux-developer-09). Домашний каталог создаётся вместе с учётной записью через adduser или useradd -m; случайный mkdir не создаёт пользователя.
Общая папка VirtualBox — другой механизм. В настройках VM выбирают каталог хоста и имя ресурса, устанавливают совместимые Guest Additions в гостевой системе. При автоматическом монтировании Linux доступ обычно предоставлен root и группе vboxsf. Администратор гостя добавляет нужного пользователя в неё через usermod -aG vboxsf ИМЯ; требуется новый вход. Проверяйте findmnt -t vboxsf, id и режим read-only, не раздавайте права 777 на каталог хоста.
Файл .desktop описывает запуск для рабочего стола. Минимальный пример можно сохранить как учебный текст:
[Desktop Entry]
Type=Application
Name=Учебный просмотр
Exec=/usr/bin/printf hello
Terminal=trueExec не является обычной строкой Bash: ~, перенаправления и произвольные shell-подстановки не работают автоматически. Проверяют файл через desktop-file-validate, если утилита установлена. Хранение в ~/.local/share/applications и запуск файла с рабочего стола — разные сценарии доверия; графическая среда может отдельно требовать разрешить запуск. chmod +x сам по себе не делает неизвестный ярлык безопасным.
Удаление и самостоятельная проверка
rmdir удаляет только пустой каталог, rm -r обходит дерево, rm -f подавляет часть вопросов и ошибок отсутствия. Команда rm каталог/* обычно пропускает скрытые имена; это не надёжный способ очистить всё. В своём стенде сначала выполните find "$file_lab/copies" -mindepth 1 -depth -print, проверьте весь список, затем find "$file_lab/copies" -mindepth 1 -depth -delete. Выбранное содержимое, включая скрытые имена, удаляется, а сам каталог copies сохраняется. Это ограниченный учебный каталог; не переносите действие на неизвестный путь. Восстановление после rm не гарантируется: при ценных данных прекращают запись и переходят к процедуре восстановления.
Создайте hardlink и symlink, удалите только имя report.txt и объясните, почему hardlink читается, а symlink повреждён. Проверьте cat report-hard.txt и test -L report-link.txt. После эксперимента удалите весь собственный стенд через rm -r -- "$file_lab". Здесь допустимость удаления известна из происхождения каталога; копирование команды с неопределённой переменной этого знания не даёт.