Введение
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, а не воспринимать команды как набор изолированных рецептов.



