Тема: Работа с файлами в Unix
Цель: знакомство с командной строкой UNIX, командами по работе с файловой системой и командами обработки текстовых файлов.
Время выполнения: 4 часа
Теоретический материал:
Изучаемые команды: cat, cd, cp, cut, echo, find, grep, head, ln, ls, mkdir, mv, paste, pwd, sort, tail, tar, touch, uniq, wc
Практические задания:
В этом сценарии будет освещено знакомство с командами UNIX, изучение файловой системы и базовых каталогов, создание рабочей среды в домашнем каталоге пользователя для выполнения всех последующих команд.
Начальные условия: Командная строка после входа в систему.
Получить имя текущего каталога с помощью команды pwd:
[user@localhost ~]$ pwd
/home/user/
Перейти в корневой каталог с помощью команды cd /:
[user@localhost ~]$ cd /
[user@localhost /]$ pwd
/
Отметить, как изменилась строка приглашения.
Посмотреть содержимое корневого каталога с помощью команды ls:
[user@localhost /]$ ls
bin dev home lib mnt proc sbin sys usr
boot etc image media opt root srv tmp var
Сравнить с использованием «расширенного» вывода команды ls -F:
[user@localhost /]$ ls -F
bin/ dev/ home/ lib/ mnt/ proc/ sbin/ sys/ usr/
boot/ etc/ image/ media/ opt/ root/ srv/ tmp/ var/
Каталоги отмечаются синим цветом и знаком «/» после имени.
Посмотреть содержимое домашнего каталога с помощью команды ls ~:
[user@localhost /]$ ls ~
Documents tmp
Домашний каталог содержит набор стандартных каталогов.
Вернуться в домашний каталог с помощью cd без параметров:
[user@localhost /]$ cd
[user@localhost ~]$
Создать каталог test
с помощью команды mkdir
test:
[user@localhost ~]$ mkdir test
Посмотреть обновлённое содержимое домашнего каталога ls:
[user@localhost ~]$ ls
Documents test tmp
Создать подкаталог subtest
в каталоге test
командой mkdir test/subtest:
[user@localhost ~]$ mkdir test/subtest
Посмотреть содержимое домашнего
каталога и его подкаталогов с помощью ключа рекурсивного просмотра –R
в команде ls -R:
[user@localhost ~]$ ls -R
.:
Documents test tmp
./Documents:
./test:
subtest
./test/subtest:
./tmp:
В этом сценарии рассматриваются типы файлов в UNIX: простые файлы, каталоги, ссылки. Изучаются команды создания и копирования файлов. Показывается разница между жесткими и символическими ссылками, между копированием и переносом файла.
Начальные условия: Командная строка. Каталог test после предыдущего сценария.
Cоздать пустой файл с помощью команды touch first.txt:
[user@localhost test]$ touch first.txt
[user@localhost test]$ ls
first.txt subtest
Добавить строку текста в конец файла с помощью команды echo "Hello, world" >> first.txt и перенаправления вывода:
[user@localhost test]$ echo "Hello, world" >> first.txt
Посмотреть содержимое файла с помощью команды cat first.txt:
[user@localhost test]$ cat first.txt
Hello, world
[user@localhost test]$
Посмотреть расширенную информацию о
каталоге, используя ключ –l
команды ls. ls -l test:
[user@localhost test]$ ls -l
total 4
-rw-r--r-- 1 user user 13 Feb 14 20:12 first.txt
drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest
Добавить псевдоним командной оболочки, чтобы сократить размер команды, с помощью команды alias ls='ls -F -l':
[user@localhost test]$ alias ls='ls -F -l'
[user@localhost test]$ ls test
total 4
-rw-r--r-- 1 user user 13 Feb 14 20:12 first.txt
drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest
Посмотреть глубже на каталог test
, используя ключи –a
и
-i
. ls -a -i
[user@localhost test]$ ls -a -i
total 4
1014 drwxr-xr-x 3 user user 100 Feb 14 20:07 ./
941 drwx------ 8 user user 340 Feb 14 19:28 ../
1081 -rw-r--r-- 1 user user 13 Feb 14 20:12 first.txt
1015 drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
Первый столбец — номера индексных узлов файловой системы. Третий столбец — число жёстких ссылок файла.
Скопировать файл с помощью команды cp first.txt copy1.txt:
[user@localhost test]$ cp first.txt copy1.txt
[user@localhost test]$ ls -a -i
total 8
1014 drwxr-xr-x 3 user user 120 Feb 14 20:33 ./
941 drwx------ 8 user user 340 Feb 14 19:28 ../
1082 -rw-r--r-- 1 user user 13 Feb 14 20:33 copy1.txt
1081 -rw-r--r-- 1 user user 13 Feb 14 20:12 first.txt
1015 drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
Новый файл имеет свой собственный индексный узел.
Переименовать файл с помощью команды mv first.txt orig.txt. mv first.txt orig.txt:
[user@localhost test]$ mv first.txt orig.txt
[user@localhost test]$ ls -a -i
total 8
1014 drwxr-xr-x 3 user user 120 Feb 14 20:37 ./
941 drwx------ 8 user user 340 Feb 14 19:28 ../
1082 -rw-r--r-- 1 user user 13 Feb 14 20:33 copy1.txt
1081 -rw-r--r-- 1 user user 13 Feb 14 20:12 orig.txt
1015 drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
Отметим, что изменилось только имя файла, все остальные атрибуты остались прежними.
Создать жёсткую ссылку командой ln orig.txt copy2.txt:
[user@localhost test]$ ln orig.txt copy2.txt
[user@localhost test]$ ls -a -i
total 12
1014 drwxr-xr-x 3 user user 140 Feb 14 20:41 ./
941 drwx------ 8 user user 340 Feb 14 19:28 ../
1082 -rw-r--r-- 1 user user 13 Feb 14 20:33 copy1.txt
1081 -rw-r--r-- 2 user user 13 Feb 14 20:12 copy2.txt
1081 -rw-r--r-- 2 user user 13 Feb 14 20:12 orig.txt
1015 drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
Добавилась ещё одна ссылка на тот же файл, число ссылок увеличилось на 1.
Создать символическую ссылку командой ln -s orig.txt orig.lnk:
[user@localhost test]$ ln -s orig.txt orig.lnk
[user@localhost test]$ ls -a -i
total 12
1014 drwxr-xr-x 3 user user 160 Feb 14 20:45 ./
941 drwx------ 8 user user 340 Feb 14 19:28 ../
1082 -rw-r--r-- 1 user user 13 Feb 14 20:33 copy1.txt
1081 -rw-r--r-- 2 user user 13 Feb 14 20:12 copy2.txt
1083 lrwxrwxrwx 1 user user 8 Feb 14 20:45 orig.lnk -> orig.txt
1081 -rw-r--r-- 2 user user 13 Feb 14 20:12 orig.txt
1015 drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
Новый файл имеет новый индексный
узел и размер, равный имени файла orig.txt
.
Сравним содержимое файлов при обращении к ним по имени:
[user@localhost test]$ cat orig.txt
Hello, world.
[user@localhost test]$ cat copy2.txt
Hello, world.
[user@localhost test]$ cat orig.lnk
Hello, world.
К одним и тем же данным можно обратиться через жесткую или символическую ссылку.
В этом сценарии изучается команда поиска файлов и каталогов.
Начальные условия: Командная строка, каталог test после прошлого сценария.
Вывести список всех файлов и каталогов в текущей директории, включая содержимое подкаталогов с помощью команды find:
[user@localhost test]$ find
./orig.lnk
./copy2.txt
./orig.txt
./copy1.txt
./subtest
Найти все файлы и дериктории в текущем каталоге и ее подкаталогах, которые начиняются на «o» с помощью команды find -name "o*":
[user@localhost test]$ find -name "o*"
./orig.lnk
./orig.txt
Найти все файлы и каталоги в
каталоге /etc
и его подкаталогах, которые
начиняются на «o» с помощью команды find /etc -name "o*":
[user@localhost test]$ find /etc -name "o*"
find: /etc/tcb: Permission denied
find: /etc/default: Permission denied
find: /etc/buildreqs: Permission denied
...
Список найденных файлов может быть слишком большим и для его просмотра можно воспользоваться «прокруткой» терминала с помощью клавиш Shift-PgUp и Shift-PgDn.
Вы увидели множество сообщений об ошибках доступа («Permission denied»), которые можно подавить с помощью перенаправления ошибок следующим образом: find /etc -name "o*" 2>/dev/null
[user@localhost test]$ find /etc -name "o*" 2>/dev/null
/etc/modprobe.d/options
/etc/modutils.d/oss
/etc/net/ifaces/default/fw/options
/etc/net/ifaces/default/options
...
/etc/pam.d/other
/etc/rc.d/init.d/outformat
Найти все каталоги в /etc
, которые начинаются на «o» с
помощью команды find /etc
-name "o*" -a -type d 2>/dev/null:
[user@localhost test]$ find /etc -name "o*" -a -type d 2>/dev/null
/etc/net/options.d
/etc/openssh
/etc/openssl
/etc/opt
Найти все обычные файлы в каталоге /var
и его подкаталогах, заканчивающиеся
на «log»:
[user@localhost test]$ find /var -name "*log" -a -type f 2>/dev/null
/var/log/Xorg.0.log
/var/log/faillog
/var/log/lastlog
Создать каталог logs
с помощью команды mkdir logs:
[user@localhost test]$ mkdir logs
Скопировать найденные файлы в
локальный каталог с помощью параметра –exec
команды find. Для этого
выполнить: find /var -name "*log" -a
-type f -exec cp {} test/logs/ 2>/dev/null:
[user@localhost test]$ find /var -name "*log" -a -type f -exec cp {} test/logs/ 2>/dev/null
[user@localhost test]$ ls test/logs
итого 789
-rw-r----- 1 user users 601033 Окт 16 18:37 emerge.log
-rw-r--r-- 1 user users 292292 Окт 16 18:37 lastlog
-rw-r--r-- 1 user users 37383 Окт 16 18:37 Xorg.0.log
Были скопированы все файлы, права на чтение которых у нас есть.
В этом сценарии изучается команда архивирования файлов и каталогов. Командная строка, каталог test после прошлого сценария.
Начальные условия:
Перейти в домашний каталог с помощью команды cd:
[user@localhost test]$ cd
[user@localhost ~]$
Создать архив с именем test.tar.gz
с применением сжатия, содержащий
каталог test
с помощью команды tar -czf
test.tar.gz test:
[user@localhost ~]$ tar -czf test.tar.gz test
[user@localhost ~]$ ls
drwxr-xr-x 4 user users 208 Окт 16 18:36 test/
-rw-r--r-- 1 user users 79173 Окт 16 18:49 test.tar.gz
Создать новый каталог для содержимого архива командой mkdir test2:
user@desktop ~ $ mkdir test2
Перейти в новый каталог с помощью команды cd test2:
user@desktop ~ $ cd test2
Развернуть содержимое архива в текущий каталог с помощью команды tar -xzf ../test.tar.gz:
user@desktop test2 $ tar -xzf ../test.tar.gz
Убедиться, что содержимое распакованного архива совпадает с оригинальным каталогом. Ввести команду ls -l -F:
user@desktoptest2 $ ls -l -F
итого 0
drwxr-xr-x 4 user users 208 Окт 16 18:36 test/
user@desktop test2 $ ls -l -F test
итого 12
-rw-r--r-- 1 user users 13 Окт 15 20:54 copy1.txt
-rw-r--r-- 2 user users 13 Окт 15 20:48 copy2.txt
drwxr-xr-x 2 user users 136 Окт 16 18:37 logs/
lrwxrwxrwx 1 user users 8 Окт 16 18:54 orig.lnk -> orig.txt
-rw-r--r-- 2 user users 13 Окт 15 20:48 orig.txt
drwxr-xr-x 2 user users 48 Окт 13 21:33 subtest/
В этом сценарии изучаются команды для создания и модифицирования текстовых файлов. Командная строка.
Начальные условия:
Ввести команду echo "One line":
user@desktoptest $ echo "Oneline"
One line
Данная команда принимает строку в виде аргумента и выводит её на стандартный вывод.
Ввести ту же команду, но
перенаправить вывод в файл second.txt
с помощью «>». Ввестикоманду echo "One line" > second.txt:
user@desktop test $ echo "One line" > second.txt
Добавить в конец файла second.txt
строку «A line»
с помощью другого перенаправления echo
"A line" >> second.txt:
user@desktop test $ echo "A line" >> second.txt
Вывести содержимое файла с помощью команды cat second.txt:
user@desktop test $ cat second.txt
One line
A line
С помощью команды cat можно создавать многострочные файлы —, если переопределить вывод программы в файл и вводить текст до нажатия Ctrl-D (конец ввода). Ввести команду cat >multiline.txt и набрать текст
user@desktoptest $ cat>multiline.txt
Simple text:
blah-blah-blah
1 2 3 4 5 6 7 8 9 0
bye!
(Ctrl+D)
user@desktop test $
Убедиться, что содержимое файла совпадает с введённым текстом, включая все переводы строки. Для этого ввести команду cat multiline.txt
user@desktoptest $ catmultiline.txt
Simple text:
blah-blah-blah
1 2 3 4 5 6 7 8 9 0
bye!
Основным назначением команды cat является объединение файлов, имена которых передаются как аргументы командной строки. Объединить файлы с помощью команды cat orig.txt second.txt multiline.txt > big.txt:
user@desktop test $ cat orig.txt second.txt multiline.txt > big.txt
Убедиться, что новый файл содержит строки из перечисленных файлов с помощью команды cat big.txt:
user@desktop test $ cat big.txt
Hello, world
One line
A line
Simple text:
blah-blah-blah
1 2 3 4 5 6 7 8 9 0
bye!
В данном сценарии изучается, как выделять информацию, разбитую на части с помощью специального символа - разделителя (например, пробела или символа :), из файлов и создавать новые структурированные файлы.
Начальные условия: Командная строка.
Посмотреть содержимое файла /etc/passwd
, в котором содержится информация о
пользователях системы, с помощью команды cat /etc/passwd:
user@desktop test $ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
adm:x:3:4:adm:/var/adm:/bin/false
lp:x:4:7:lp:/var/spool/lpd:/bin/false
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...
Каждая строка хранит запись об отдельном пользователе. Запись состоит из полей, разделённых символом «:».
Выделить первый столбец в каждой записи, установив разделитель в «:», с помощью команды cat /etc/passwd | cut -f1 -d::
user@desktop test $ cat /etc/passwd | cut -f1 -d:
root
bin
daemon
adm
lp
sync
shutdown
...
Отсортировать список пользователей по алфавиту с помощью команды cat /etc/passwd | cut -f1 -d: | sort:
user@desktop test $ cat /etc/passwd | cut -f1 -d: | sort
adm
alias
apache
at
bin
cron
cyrus
...
Выделить седьмой столбец в каждой записи, соответствующий командной оболочке пользователя, с помощью команды cat /etc/passwd | cut -f7 -d:
user@desktop test $ cat /etc/passwd | cut -f7 -d:
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/sync
...
Список содержит много повторяющихся строк.
Удалить повторяющиеся строки командой cat /etc/passwd | cut -f7 -d: | uniq:
user@desktop test $ cat /etc/passwd | cut -f7 -d: | uniq
/bin/bash
/bin/false
/bin/sync
/sbin/shutdown
/sbin/halt
/bin/false
...
Некоторые повторяющиеся строки остались, так как сравниваются только последовательные строки.
Добиться полной уникальности, предварительно отсортировав строки с помощью команды sort. Ввести команду cat /etc/passwd | cut -f7 -d: | sort | uniq:
user@desktop test $ cat /etc/passwd | cut -f7 -d: | sort | uniq
/bin/bash
/bin/false
/bin/sync
/dev/null
/sbin/halt
/sbin/shutdown
Выделить первый и седьмой столбец
файла /etc/passwd
в отдельные
файлы. Для этого ввести команды cat
/etc/passwd | cut -f1 -d: > users и cat /etc/passwd |
cut -f7 -d: > shells:
user@desktop test $ cat /etc/passwd | cut -f1 -d: > users
user@desktop test $ cat /etc/passwd | cut -f7 -d: > shells
Объединить результаты с помощью команды paste users shells:
user@desktop test $ paste users shells
root /bin/bash
bin /bin/false
daemon /bin/false
adm /bin/false
lp /bin/false
sync /bin/sync
...
В данном сценарии изучаются команды, которые позволяют провести первичный анализ файла: с чего он начинается, как заканчивается и каков его размер.
Начальные условия: Командная строка.
Получить число строк в файле /etc/passwd
с помощью команды wc -l /etc/passwd:
user@desktop test $ wc -l /etc/passwd
44 /etc/passwd
Или другим способом: посчитав число
слов в созданном ранее файле users
с помощью команды cat users | wc -w:
user@desktop test $ cat users | wc -w
44
Посмотреть первые несколько строк длинного файла с помощью команды head logs/Xorg.0.log:
user@desktop test $ head logs/Xorg.0.log
X Window System Version 6.8.2
Release Date: 9 February 2005
X Protocol Version 11, Revision 0, Release 6.8.2
Build Operating System: Linux 2.6.13-gentoo i686 [ELF]
Current Operating System: Linux thinkpad 2.6.13-gentoo #1 Wed Sep 7 01:03:14 MSD 2005 i686
Build Date: 08 October 2005
Before reporting problems, check http://wiki.X.Org
to make sure that you have the latest version.
Module Loader present
Аналогично, посмотреть последние несколько строк с помощью команды tail logs/Xorg.0.log:
user@desktop test $ tail logs/Xorg.0.log
(II) RADEON(0): [RESUME] Attempting to re-init Radeon hardware.
(II) RADEON(0): [agp] Mode 0x1f000201 [AGP 0x8086/0x3340; Card 0x1002/0x4c66]
(II) Mouse1: ps2EnableDataReporting: succeeded
SetClientVersion: 0 8
SetGrabKeysState - disabled
SetGrabKeysState - enabled
(II) 3rd Button detected: disabling emulate3Button
SetClientVersion: 0 8
SetGrabKeysState - disabled
SetGrabKeysState - enabled
Это бывает полезно при просмотре системных журналов — в них самые последние события содержатся в конце файлов.
В данном сценарии рассматривается практическое использование регулярных выражений для поиска по текстовым файлам.
Начальные условия: Командная строка. Каталог test/log с найденными системными журналами.
Среди найденных системных журналов
посмотреть файл журнала загрузки графичской системы XFree86.0.log
с помощью команды less test/log/XFree86.0.log:
user@desktop ~ $ less test/log/XFree86.0.log
Выйти из просмоторщика можно нажатием клавиши q.
Найти все предупреждения в журнале: строка, начинающаяся с «(WW)». Для этого ввести команду grep "^(WW)" test/log/XFree86.0.log:
user@desktop ~ $ grep "^(WW)" test/log/XFree86.0.log
(WW) The directory "/usr/share/fonts/freefonts/" does not exist.
(WW) The directory "/usr/share/fonts/unifont/" does not exist.
(WW) The directory "/usr/share/fonts/artwiz/" does not exist.
...
Получить все строки, содержащие следующий шаблон: последовательность из 1 или более цифры или буквы, затем символ собаки, затем еще одна последовательность 1 или более цифры или буквы или точки, затем символ точки, затем от двух до четырёх букв (имя домена первого уровня). Также служебный вывод ошибок удаляется (перенаправляется в нулевое устройство). Для этого ввести команду grep "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:
user@desktop ~ $ grep "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
/etc/devfsd.conf:# Richard Gooch <rgooch@atnf.csiro.au> 3-JUL-2000
/etc/inittab:# Author: Miquel van Smoorenburg, <miquels@cistron.nl>
/etc/inittab:# Modified by: Patrick J. Volkerding, <volkerdi@ftp.cdrom.com>
...
При работе с несколькими файлами grep по умолчанию использует вывод имени файла перед найденной строкой.
Избавиться от имени файла в начале
строки с помощью ключа -h
. Ввести команду grep -h
"[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:
user@desktop ~ $ grep -h "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
# Richard Gooch <rgooch@atnf.csiro.au> 3-JUL-2000
# Author: Miquel van Smoorenburg, <miquels@cistron.nl>
# Modified by: Patrick J. Volkerding, <volkerdi@ftp.cdrom.com>
...
1) Создайте каталог test1 в домашнем каталоге. Сравните время создания системных каталогов /bin, /tmp с каталогом test1.
2) Скопируйте файл /bin/ls в локальный каталог. Посмотрите атрибуты этого файла. Попробуйте запустить его.
3) Создайте в локальном каталоге символическую ссылку tmplnk на каталог /tmp. Скопируйте несколько файлов в каталог tmplnk.
4) Сравните файлы /dev/tty1 и /dev/hda1. Какой тип они имеют? Чем они отличаются?
5) Найдите все файлы в системе, которые были модифицированы не более суток назад.
6) С помощью одной команды найдите все файлы с расширением .html в каталоге /usr и скопируйте их в локальный каталог htmls.
7) Создайте архив каталога /etc и узнайте его размер. Попробуйте создать сжатый архив того же каталога. Сравните степень сжатия gzip и bzip2 на этом примере.
8) Создайте текстовый файл a.txt из десяти строк. Узнайте его размер. Создайте новый файл, содержащий в себе файл a.txt четыре раза.
9) С помощью одной команды найдите все файлы с расширением .txt в каталоге /usr и объедините их в один большой файл big.txt.
10) Получите с помощью одной команды файл, содержащий все числовые идентификаторы пользователей, зарегистрированных в ситсеме.
11) Получите с помощью одной команды строки с 5-ой по 8-ю в файле /proc/cpuinfo, содержащем информацию о процессоре.
12) Придумайте регулярное выражение, соответствующее URL с использованием протокола http. Найдите все строки, содержащие такие URL в файлах каталога /etc.
13) С помощью одной команды найдите все файлы с расширениями .txt или .html в каталоге /usr, в которых содержится слово user.
1. Перечислите этапы создания каталога в корневом каталоге?
2. Какие типы файлов существуют в ОС UNIX?
3. Перечислите структурные элементы имени каждого типа файлов ОС UNIX?
Скачано с www.znanio.ru
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.