ЯдроКодаподготовка к экзаменам
Учебная платформа

Загружаем материалы

Подготавливаем материалы и навигацию по разделу.

Файлы 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=true

Exec не является обычной строкой 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". Здесь допустимость удаления известна из происхождения каталога; копирование команды с неопределённой переменной этого знания не даёт.

Источники