Операции с файлами и каталогами

LinuxBeginner
Практиковаться сейчас

Введение

Linux организует файлы в одном дереве каталогов, которое начинается с / — корневого каталога. У каждого файла и каталога есть путь, описывающий его расположение в этом дереве. Умение читать и использовать пути значительно упрощает почти любую последующую задачу в Linux.

В этой лабораторной работе вы создадите небольшую рабочую область и освоите операции, которые используются при повседневной работе в терминале. Вы будете перемещаться по каталогам, создавать и редактировать файлы, копировать и перемещать данные, искать файлы, просматривать метаданные и inode, экспериментировать с жёсткими и символическими ссылками, а также сравнивать файлы и деревья каталогов с помощью diff.

Исследуйте дерево каталогов Linux

На этом шаге вы определите текущее местоположение, просмотрите важные каталоги верхнего уровня и создадите отдельную рабочую область для остальных шагов лабораторной работы.

Команда pwd означает «вывести рабочий каталог». Сначала выполните её, чтобы узнать, в каком каталоге был открыт терминал:

pwd

Результатом должно быть /home/labex/project. Абсолютный путь начинается с / и описывает расположение относительно корня файловой системы.

Выведите содержимое верхнего уровня файловой системы:

ls /

Вы увидите стандартные каталоги, например etc, home, tmp, usr и var. Их основное назначение:

  • /etc хранит общесистемные конфигурации.
  • /home хранит домашние каталоги обычных пользователей.
  • /tmp хранит временные данные.
  • /usr содержит множество установленных программ и общих ресурсов.
  • /var содержит изменяющиеся данные, например журналы и кэши.

Параметр -d указывает ls вывести сведения о названных каталогах, а не их содержимое. Параметр -l выбирает подробный формат:

ls -ld /etc /home /tmp /usr /var

Первый символ каждой строки — d, то есть объект является каталогом. В остальных столбцах указаны права доступа, владелец, размер, время и имя.

Создайте рабочую область для этой лабораторной работы. Параметр -p позволяет mkdir создавать отсутствующие родительские каталоги и не выдавать ошибку, если каталог уже существует:

mkdir -p /home/labex/project/file-ops-lab

Перейдите в этот каталог и проверьте новое местоположение:

cd /home/labex/project/file-ops-lab
pwd

В последней строке вывода должно быть /home/labex/project/file-ops-lab.

Перемещайтесь с помощью абсолютных и относительных путей

На этом шаге вы создадите вложенное дерево каталогов и будете перемещаться по нему с помощью абсолютных путей, относительных путей и сокращений для навигации.

Убедитесь, что начинаете в рабочей области лабораторной работы:

cd /home/labex/project/file-ops-lab

Создайте три вложенных каталога одной командой:

mkdir -p navigation/alpha/beta

Здесь navigation/alpha/beta — относительный путь, потому что он не начинается с /. Оболочка разрешает его относительно текущего каталога.

Используйте абсолютный путь, чтобы перейти в самый глубокий каталог:

cd /home/labex/project/file-ops-lab/navigation/alpha/beta
pwd

Специальный путь .. обозначает родительский каталог. Перейдите из beta в alpha:

cd ..
pwd

Вывод должен заканчиваться на /navigation/alpha. Команда cd - возвращает вас в предыдущий рабочий каталог:

cd -
pwd

Вы должны снова оказаться в beta. Наконец, ~ обозначает ваш домашний каталог. Используйте его в начале пути, чтобы вернуться в рабочую область лабораторной работы:

cd ~/project/file-ops-lab
pwd

Абсолютные пути работают из любого местоположения. Относительные пути короче, если вы уже знаете свой текущий каталог.

Создавайте каталоги и записывайте файлы

На этом шаге вы создадите каталоги и файлы, а затем изучите разницу между перезаписью и добавлением данных с помощью перенаправления оболочки.

Начните в рабочей области лабораторной работы и создайте сразу два каталога:

cd /home/labex/project/file-ops-lab
mkdir documents archive

Команда touch создаёт пустой файл, если указанного файла не существует:

touch documents/empty.txt

Просмотрите пустой файл в подробном формате:

ls -l documents/empty.txt

Его размер должен быть равен 0 байт. Далее оператор > перенаправляет вывод команды в файл. Он создаёт файл или заменяет его прежнее содержимое:

echo "Linux file practice" > documents/notes.txt

Оператор >> добавляет вывод, не удаляя существующее содержимое:

echo "Paths identify each filesystem object" >> documents/notes.txt

Выведите весь файл с помощью cat:

cat documents/notes.txt

Вы должны увидеть две строки в исходном порядке. Подсчитайте их с помощью wc -l; параметр -l указывает wc считать строки:

wc -l documents/notes.txt

Первое поле должно содержать 2.

Копируйте, перемещайте, переименовывайте и удаляйте файлы

На этом шаге вы потренируетесь в четырёх распространённых операциях изменения объектов файловой системы: копировании, перемещении, переименовании и удалении.

Вернитесь в рабочую область лабораторной работы:

cd /home/labex/project/file-ops-lab

Команда cp копирует источник в место назначения. Скопируйте notes.txt в архив под новым именем:

cp documents/notes.txt archive/notes-backup.txt

Убедитесь, что исходный файл и копия существуют:

ls -l documents/notes.txt archive/notes-backup.txt

Создайте временный файл, затем с помощью mv одновременно переместите и переименуйте его:

echo "draft" > documents/draft.txt
mv documents/draft.txt archive/final-draft.txt

Старого пути больше не должно быть, а новый путь должен существовать:

ls -l archive/final-draft.txt

Чтобы скопировать каталог вместе со всем его содержимым, используйте рекурсивный параметр -r:

cp -r documents archive/documents-copy
find archive/documents-copy -maxdepth 1 -type f

Команда rm безвозвратно удаляет файлы; в терминале нет корзины. Создайте и удалите ненужный файл:

touch disposable.tmp
rm disposable.tmp

Выведите содержимое текущего каталога и убедитесь, что этот путь исчез:

ls

disposable.tmp не должен отображаться. Всегда внимательно проверяйте путь перед использованием rm.

Просматривайте, изменяйте и находите файлы

На этом шаге вы создадите многострочный файл, просмотрите его части, обновите его с помощью перенаправления добавления и найдёте его по имени.

Вернитесь в рабочую область лабораторной работы. Here-документ передаёт команде несколько строк, пока оболочка не встретит строку, содержащую только выбранный маркер — в данном случае EOF:

cd /home/labex/project/file-ops-lab
cat > documents/journal.txt <<'EOF'
First entry: created a workspace
Second entry: practiced paths
Third entry: copied files
EOF

Кавычки 'EOF' не позволяют оболочке подставлять специальные символы внутри документа. Выведите файл с номерами строк:

nl -ba documents/journal.txt

Параметр -ba нумерует все строки. Используйте head -n 2, чтобы вывести первые две строки, и tail -n 1, чтобы вывести последнюю строку:

head -n 2 documents/journal.txt
tail -n 1 documents/journal.txt

Добавьте четвёртую запись. Ранее вы использовали >>; этот оператор добавляет вывод в конец файла, не заменяя существующие три строки:

echo "Fourth entry: reviewed the results" >> documents/journal.txt

Проверьте результат:

tail -n 2 documents/journal.txt

Теперь найдите в рабочей области текстовые файлы. В find точка . обозначает текущий каталог, -type f ограничивает результаты обычными файлами, а -name сопоставляет шаблон имени файла. Кавычки не позволяют оболочке раскрыть *.txt до того, как этот шаблон получит find:

find . -type f -name "*.txt"

В выводе должен быть ./documents/journal.txt, а также другие созданные вами текстовые файлы.

Просматривайте типы файлов, метаданные и inode

На этом шаге вы выйдете за пределы имени файла и изучите сведения, которые Linux хранит об объекте файловой системы.

Начните в рабочей области лабораторной работы и попросите file определить два разных объекта:

cd /home/labex/project/file-ops-lab
file documents/journal.txt /bin/ls

Журнал будет определён как текстовый файл, а /bin/ls — как исполняемая программа. Linux определяет данные не только по расширениям имён файлов.

Команда stat выводит такие метаданные, как размер, права доступа, владелец, временные отметки и номер inode:

stat documents/journal.txt

Inode — это запись файловой системы, в которой хранятся метаданные файла и указатель на его данные. Имя файла — это запись каталога, ссылающаяся на inode. Используйте пользовательский формат stat, чтобы вывести стабильный набор полей:

stat -c 'name=%n type=%F size=%s inode=%i links=%h' documents/journal.txt

Поле %i содержит номер inode, а %h — количество жёстких ссылок, ссылающихся на этот inode.

Параметр -i команды ls также выводит номера inode. Создайте файл для практики работы с метаданными и просмотрите его:

echo "inode practice" > metadata-sample.txt
ls -li metadata-sample.txt

Число в начале строки — это номер inode. В разных окружениях он может отличаться, поэтому сосредоточьтесь на назначении этого поля, а не на запоминании его значения.

Работайте с жёсткими и символическими ссылками

На этом шаге вы создадите оба типа ссылок в Linux и посмотрите, как они ведут себя после удаления исходного имени файла.

Создайте каталог и исходный файл для эксперимента:

cd /home/labex/project/file-ops-lab
mkdir links
echo "shared inode data" > links/source.txt

Команда ln без параметров создаёт жёсткую ссылку. Оба имени указывают на один inode и одни и те же данные файла:

ln links/source.txt links/hard-link.txt

Параметр -s создаёт символическую ссылку, которую также называют symlink. Символическая ссылка хранит путь к другому файлу:

ln -s source.txt links/symbolic-link.txt

Сравните номера inode и сведения о ссылках:

ls -li links

У source.txt и hard-link.txt должен быть одинаковый номер inode. У символической ссылки собственный inode; в выводе также отображается -> source.txt.

С помощью readlink выведите путь, сохранённый внутри символической ссылки:

readlink links/symbolic-link.txt

Удалите исходное имя файла:

rm links/source.txt

Жёсткая ссылка по-прежнему позволяет получить доступ к inode и его данным:

cat links/hard-link.txt

Теперь символическая ссылка указывает на имя, которого больше не существует. Попробуйте прочитать её:

cat links/symbolic-link.txt

Ожидается ошибка No such file or directory. Она наглядно показывает, что объект ссылки остаётся, но сохранённый в ней целевой путь становится недействительным. Этот эксперимент демонстрирует, почему удаление одного имени жёсткой ссылки не удаляет данные, пока сохраняется другая жёсткая ссылка, тогда как символическая ссылка зависит от сохранённого в ней целевого пути.

Сравнивайте файлы и каталоги с помощью diff

На этом шаге вы используете diff, чтобы найти различия, а затем синхронизируете два небольших дерева каталогов.

Создайте два каталога версий:

cd /home/labex/project/file-ops-lab
mkdir -p comparison/version-a comparison/version-b

Создайте конфигурационные файлы, различающиеся одной строкой:

printf 'mode=production\nport=8080\n' > comparison/version-a/app.conf
printf 'mode=production\nport=9090\n' > comparison/version-b/app.conf

Параметр -u запрашивает у diff унифицированное представление с контекстом вокруг каждого изменения:

diff -u comparison/version-a/app.conf comparison/version-b/app.conf

diff помечает строки из первого файла знаком -, а строки из второго — знаком +. Ненулевой код завершения означает, что файлы различаются; в данном случае это ожидаемо.

Сделайте второй файл таким же, как первый, а затем используйте -q для тихой проверки равенства:

cp comparison/version-a/app.conf comparison/version-b/app.conf
diff -q comparison/version-a/app.conf comparison/version-b/app.conf

Отсутствие вывода означает, что файлы совпадают. Теперь добавьте файл только в один каталог:

echo "release notes" > comparison/version-a/README.txt

Параметр -r рекурсивно сравнивает деревья каталогов:

diff -r comparison/version-a comparison/version-b

В выводе будет указано, что README.txt существует только в version-a. Скопируйте его и выполните сравнение ещё раз:

cp comparison/version-a/README.txt comparison/version-b/README.txt
diff -r comparison/version-a comparison/version-b

Последняя команда не должна вывести ничего. Это подтверждает, что оба дерева каталогов теперь содержат одинаковые файлы.

Итоги

Вы потренировались выполнять основные операции с файлами и каталогами, которые используются в терминале Linux. Вы перемещались с помощью абсолютных и относительных путей, создавали и редактировали файлы, копировали и перемещали данные, безопасно удаляли ненужный файл и искали файлы по имени.

Кроме того, вы изучили типы файлов и метаданные, узнали, как имена файлов связаны с inode, сравнили жёсткие и символические ссылки и использовали diff для сравнения отдельных файлов и целых деревьев каталогов. Эти знания помогут вам рассуждать о файлах Linux, а не воспринимать команды как набор изолированных рецептов.