Практическая работа №6. Работа с файлами в UNIX

Цель работы: знакомство с командной строкой UNIX, командами по работе с файловой системой и командами обработки текстовых файлов.

Изучаемые команды: cat, cd, cp, cut, echo, find, grep, head, ln, ls, mkdir, mv, paste, pwd, sort, tail, tar, touch, uniq, wc

Знакомство с каталогами UNIX

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

Начальные условия: Командная строка после входа в систему.

  1. Получить имя текущего каталога с помощью команды pwd:

    user@desktop ~ $ pwd
    /home/user/
  2. Перейти в корневой каталог с помощью команды cd /:

    user@desktop ~ $ cd /
    user@desktop / $ pwd
    /

    Отметить, как изменилось строка приглашения.

  3. Посмотреть содержимое корневого каталога с помощью команды ls:

    user@desktop / $ ls
    bin   dev  home  mnt  proc  sbin  tmp  var
    boot  etc  lib   opt  root  sys   usr
  4. Сравнить с использованием «раскрашенного» вывода команды ls -F --color:

    user@desktop / $ ls -F --color
    bin/   dev/  home/  mnt/  proc/  sbin/  tmp/  var/
    boot/  etc/  lib/   opt/  root/  sys/   usr/

    Директории отмечаются синим цветом и знаком «/» после имени.

  5. Посмотреть содержимое домашнего каталога с помощью команды ls -F --color ~:

    user@desktop / $ ls -F --color ~
    user@desktop / $

    Возможно, домашний каталог пуст.

  6. Вернуться в домашний каталог с помощью cd без параметров:

    user@desktop / $ cd
    user@desktop ~ $
  7. Создать директорию test с помощью команды mkdir test:

    user@desktop ~ $ mkdir test
  8. Посмотреть обновлённое содержимое домашнего каталога ls -F --color:

    user@desktop ~ $ ls -F --color
    test/
  9. Создать поддиректорию subtest в директории test командой mkdir test/subtest:

    user@desktop ~ $ mkdir test/subtest
  10. Посмотреть содержимое домашнего каталога и его подкаталогов с помощью ключа рекурсивного просмотра -R в команде ls -F --color -R:

    user@desktop ~ $ ls -F --color -R
    .:
    test/
    test:
    subtest/
    
    test/subtest:

Изучение типов файлов в UNIX

Тут рассматриваются типы файлов в UNIX: простые файлы, директории, ссылки. Изучаются команды создания и копирования файлов. Показывается разница между жесткими и символическими ссылками, между копированием и переносом файла.

Начальные условия: Командная строка. Директория test после предыдущего сценария.

  1. Cоздать пустой файл с помощью команды touch test/first.txt:

    user@desktop ~ $ touch test/first.txt
    user@desktop ~ $ ls -F --color test/                
    first.txt  subtest/
  2. Добавить строку текста в конец файла с помощью команды echo "Hello, world" >> test/first.txt и перенаправления вывода:

    user@desktop ~ $ echo "Hello, world" >> test/first.txt
  3. Посмотреть содержимое файла с помощью команды cat test/first.txt:

    user@desktop ~ $ cat test/first.txt
    Hello, world
    user@desktop ~ $
  4. Посмотреть расширенную информацию о каталоге, используя ключ -l команды ls. ls -F --color -l test:

    user@desktop ~ $ ls -F --color -l test
    итого 4
    -rw-r--r--  1 user users 13 Окт 15 20:48 first.txt
    drwxr-xr-x  2 user users 48 Окт 13 21:33 subtest/
  5. Добавить псевдоним командной оболочки, чтобы сократить размер команды, с помощью команды alias ls='ls -F --color -l':

    user@desktop ~ $ alias ls='ls -F --color -l'
    user@desktop ~ $ ls test
    итого 4
    -rw-r--r--  1 user users 13 Окт 15 20:48 first.txt
    drwxr-xr-x  2 user users 48 Окт 13 21:33 subtest/
  6. Посмотреть глубже на директорию test, используя ключи -a и -i. ls -a -i test

    user@desktop ~ $ ls -a -i test
    итого 7
    drwxr-xr-x   3 user users  104 Окт 15 20:49 ./
    drwx------  67 user users 3352 Окт 15 20:42 ../
    -rw-r--r--   1 user users   13 Окт 15 20:48 first.txt
    drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/

    Первый столбец – номера индексных узлов файловой системы. Третий столбец – число жёстких ссылок файла.

  7. Перейти в каталог test с помощью команды cd test

    user@desktop ~ $ cd test
  8. Скопировать файл с помощью команды cp first.txt copy1.txt:

    user@desktop test $ cp first.txt copy1.txt
    user@desktop test $ ls -a -i 
    итого 11
    5522107 drwxr-xr-x   3 user users  136 Окт 15 20:54 ./
    384269 drwx------  67 user users 3352 Окт 15 20:42 ../
    5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
    5937954 -rw-r--r--   1 user users   13 Окт 15 20:48 first.txt
    6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/

    Новый файл имеет свой собственный индексный узел.

  9. Переименовать файл с помощью команды mv first.txt orig.txt. mv first.txt orig.txt:

    user@desktop test $ mv first.txt orig.txt
    user@desktop test $ ls -a -i
    итого 11
    5522107 drwxr-xr-x   3 user users  128 Окт 15 20:59 ./
    384269 drwx------  67 user users 3352 Окт 15 20:42 ../
    5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
    5937954 -rw-r--r--   1 user users   13 Окт 15 20:48 orig.txt
    6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/

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

  10. Создать жёсткую ссылку командой ln orig.txt copy2.txt:

    user@desktop test $ ln orig.txt copy2.txt
    user@desktop test $ ls -a -i
    итого 15
    5522107 drwxr-xr-x   3 user users  160 Окт 15 21:00 ./
    384269 drwx------  67 user users 3352 Окт 15 20:42 ../
    5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
    5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 copy2.txt
    5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 orig.txt
    6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/

    Добавилась ещё одна ссылка на тот же файл, число ссылок увеличилось на 1.

  11. Создать символическую ссылку командой ln -s orig.txt orig.lnk:

    user@desktop test $ ln -s orig.txt orig.lnk
    user@desktop test $ ls -a -i
    итого 15
    5522107 drwxr-xr-x   3 user users  184 Окт 15 21:18 ./
    384269 drwx------  67 user users 3352 Окт 15 21:02 ../
    5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
    5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 copy2.txt
    5938189 lrwxrwxrwx   1 user users    8 Окт 15 21:18 orig.lnk -> orig.txt
    5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 orig.txt
    6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/

    Новый файл имеет новый индексный узел и размер, равный имени файла orig.txt.

  12. Сравним содержимое файлов при обращении к ним по имени:

    user@desktop test $ cat orig.txt
    Hello, world
    user@desktop test $ cat copy2.txt
    Hello, world
    user@desktop test $ cat orig.lnk
    Hello, world

    К одним и тем же данным можно обратиться через жесткую или символическую ссылку.

Поиск системных журналов

Изучается команда поиска файлов и директорий.

Начальные условия: Командная строка, директория test после прошлого сценария.

  1. Перейти в каталог test с помощью команды cd test:

    user@desktop ~ $ cd test
  2. Вывести список всех файлов и директорий в текущей директории, включая содержимое поддиректорий с помощью команды find:

    user@desktop ~ $ find
    .
    ./orig.lnk
    ./orig.txt
    ./subtest
    ./copy1.txt
    ./copy2.txt
  3. Найти все файлы и дериктории в текущей директории и ее поддиректориях, которые начиняются на «o» с помощью команды find -name "o*":

    user@desktop ~ $ find -name "o*"
    ./orig.lnk
    ./orig.txt
  4. Найти все файлы и дериктории в директории /etc и ее поддиректориях, которые начиняются на «o» с помощью команды find /etc -name "o*":

    user@desktop ~ $ find /etc -name "o*"
    /etc/apm/other.d
    /etc/joe/syntax/ocaml.jsf
    /etc/opt
    /etc/ppp/options-pptp
    /etc/ppp/options-pppoe
    /etc/ppp/options
    /etc/ssl/openssl.cnf
    /etc/dpkg/origins
    /etc/pam.d/other
    /etc/texmf/tex/plain/config/omega.ini
  5. Найти все обычные файлы в директории /etc и ее поддиректориях, которые начинаются на «o» с помощью команды find /etc -name "o*" -a -type f:

    user@desktop ~ $ find /etc -name "o*" -a -type f
    /etc/joe/syntax/ocaml.jsf
    /etc/ppp/options-pptp
    /etc/ppp/options-pppoe
    /etc/ppp/options
    /etc/ssl/openssl.cnf
    /etc/pam.d/other
    /etc/texmf/tex/plain/config/omega.ini
  6. Найти все обычные файлы в директории /var/ и ее поддиректориях, заканчивающиеся на «log»:

    user@desktop ~ $ find /var -name "*log" -a -type f
    find: /var/lib/mysql: Permission denied
    find: /var/lib/samba/private: Permission denied
    ...
    /var/log/emerge.log
    /var/log/lastlog
    /var/log/faillog
    /var/log/Xorg.0.log

    Список найденных файлов может быть слишком большим и для его просмотра можно воспользоваться «прокруткой» терминала с помощью клавиш Shift+PgUp и Shift+PgDn

  7. Исключить вывод сообщений об ошибках (например, «Permission denied») с помощью перенаправления вывода ошибок в специальное устройство /dev/null. Для этого ввести команду find /var -name "*log" -a -type f 2>/dev/null

    user@desktop ~ $ find /var -name "*log" -a -type f  2>/dev/null
    /var/log/emerge.log
    /var/log/lastlog
    /var/log/faillog
    /var/log/Xorg.0.log
  8. Создать директорию logs с помощью команды mkdir test/logs:

    user@desktop ~ $ mkdir test/logs
  9. Скопировать найденные файлы в локальную директорию с помощью параметра -exec команды find. Для этого ввести команду find /var -name "*log" -a -type f -exec cp {} test/logs/ \; 2>/dev/null

    user@desktop ~ $ find /var -name "*log" -a -type f -exec cp {} test/logs/ \; 2>/dev/null
    user@desktop ~ $ 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 после прошлого сценария.

Начальные условия:

  1. Перейти в домашнюю директорию с помощью команды cd:

    user@desktop test $ cd
    user@desktop ~ $
  2. Создать архив с именем test.tar.gz с применением сжатия, содержащий директорию test с помощью команды tar -czf test.tar.gz test:

    user@desktop ~ $ tar -czf test.tar.gz test
    user@desktop ~ $ 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
  3. Создать новую директорию для содержимого архива командой mkdir test2:

    user@desktop ~ $ mkdir test2
  4. Перейти в новую директорию с помощью команды cd test2:

    user@desktop ~ $ cd test2
  5. Развернуть содержимое архива в текущую директорию с помощью команды tar -xzf ../test.tar.gz:

    user@desktop test2 $ tar -xzf ../test.tar.gz
  6. Убедиться, что содержимое распакованного архива совпадает с оригинальной директорией. Ввести команду ls -l -F:

    user@desktop test2 $ 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/

Создание новых текстовых файлов

Тут изучаются команды для создания и модифицирования текстовых файлов. Командная строка.

Начальные условия:

  1. Ввести команду echo "One line":

    user@desktop test $ echo "One line"
    One line

    Данная команда принимает строку в виде аргумента и выводит её на стандартный вывод.

  2. Ввести ту же команду, но перенаправить вывод в файл second.txt с помощью «>». Ввести команду echo "One line" > second.txt:

    user@desktop test $ echo "One line" > second.txt
  3. Добавить в конец файла second.txt строку «A line» с помощью другого перенаправления echo "A line" >> second.txt:

    user@desktop test $ echo "A line" >> second.txt
  4. Вывести содержимое файла с помощью команды cat second.txt:

    user@desktop test $ cat second.txt
    One line
    A line
  5. С помощью команды cat можно создавать многострочные файлы –, если переопределить вывод программы в файл и вводить текст до нажатия Ctrl+D (конец ввода). Ввести команду cat >multiline.txt и набрать текст

    user@desktop test $ cat >multiline.txt
    Simple text:
    blah-blah-blah
    1 2 3 4 5 6 7 8 9 0
    
    bye!
    
    (Ctrl+D)
    user@desktop test $
  6. Убедиться, что содержимое файла совпадает с введённым текстом, включая все переводы строки. Для этого ввести команду cat multiline.txt

    user@desktop test $ cat multiline.txt
    Simple text:
    blah-blah-blah
    1 2 3 4 5 6 7 8 9 0
    
    bye!
  7. Основным назначением команды cat является объединение файлов, имена которых передаются как аргументы командной строки. Объединить файлы с помощью команды cat orig.txt second.txt multiline.txt > big.txt:

    user@desktop test $ cat orig.txt second.txt multiline.txt > big.txt
  8. Убедиться, что новый файл содержит строки из перечисленных файлов с помощью команды 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!

Разрезание и склеивание файлов

Здесь изучается, как выделять информацию, разбитую на части с помощью специального символа-разделителя (например, пробела или символа :), из файлов и создавать новые структурированные файлы.

Начальные условия: Командная строка.

  1. Посмотреть содержимое файла /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
    ...

    Каждая строка хранит запись об отдельном пользователе. Запись состоит из полей, разделённых символом «:».

  2. Выделить первый столбец в каждой записи, установив разделитель в «:», с потощью команды cat /etc/passwd | cut -f1 -d::

    user@desktop test $ cat /etc/passwd | cut -f1 -d:
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    ...
  3. Отсортировать список пользователей по алфавиту с помощью команды cat /etc/passwd | cut -f1 -d: | sort:

    user@desktop test $ cat /etc/passwd | cut -f1 -d: | sort
    adm
    alias
    apache
    at
    bin
    cron
    cyrus
    ...
  4. Выделить седьмой столбец в каждой записи, соответствующий командной оболочке пользователя, с помощью команды 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
    ...

    Список содержит много повторяющихся строк.

  5. Удалить повторяющиеся строки командой 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
    ...

    Некоторые повторяющиеся строки остались, так как сравниваются только последовательные строки.

  6. Добиться полной уникальности, предварительно отсортировав строки с помощью команды 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
  7. Выделить первый и седьмой столбец файла /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
  8. Объединить результаты с помощью команды 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
    ...

Быстрый анализ текстов

Изучим команды, которые позволяют провести первичный анализ файла: с чего он начинается, как заканчивается и каков его размер.

Начальные условия: Командная строка.

  1. Получить число строк в файле /etc/passwd с помощью команды wc -l /etc/passwd :

    user@desktop test $ wc -l /etc/passwd
    44 /etc/passwd
  2. Или другим способом: посчитав число слов в созданном ранее файле users с помощью команды cat users | wc -w:

    user@desktop test $ cat users | wc -w
    44
  3. Посмотреть первые несколько строк длинного файла с помощью команды 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
  4. Аналогично, посмотреть последние несколько строк с помощью команды 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 с найденными системными журналами.

  1. Скопировать файл журнала rpmpkgs

  2. Среди найденных системных журналов посмотреть файл журнала пакетного менеджера rpm с помощью команды less test/log/rpmpkgs :

    user@desktop ~ $ less test/log/rpmpkgs

    Выйти из less можно нажатием клавиши q.

  3. Найти все предупреждения в журнале: строка, начинающаяся с «(WW)». Для этого ввести команду grep "^(WW)" test/log/rpmpkgs:

    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.
    ...
  4. Получить все строки, содержащие следующий шаблон: последовательность из 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 по умолчанию использует вывод имени файла перед найденной строкой.

  5. Избавиться от имени файла в начале строки с помощью ключа -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>
                          ...
  6. Для вывода только найденной подстроки используется ключ -o. Ввести команду grep -ho "[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:

    user@desktop ~ $ grep -ho "[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
    rgooch@atnf.csiro.au
    miquels@cistron.nl
    volkerdi@ftp.cdrom.com
    ...
  7. Получить все файлы директории /etc/ с помощью команды find /etc -type f 2>/dev/null, игнорируя ошибки:

    user@desktop ~ $ find /etc -type f 2>/dev/null
    /etc/X11/xorg.conf.example
    /etc/X11/Sessions/kde-3.4
    /etc/X11/Sessions/Xsession
    /etc/X11/chooser.sh
    ...
  8. Для каждого из найденных файлов произвести поиск подстроки «nameserver». Для этого ввести команду find /etc -type f -exec grep "nameserver" {} \; 2>/dev/null:

    user@desktop ~ $ find /etc -type f -exec grep "nameserver" {} \; 2>/dev/null
    # merge the new nameservers with the other options from the old ...
    grep --invert-match '^nameserver[[:space:]]' $REALRESOLVCONF
    nameserver 10.22.10.20
    ...
  9. Для большего удобства добавить вывод имени файла (ключ -H) и номера строки (ключ -n), на которой было найдено совпадение, с помощью команды find /etc -type f -exec grep -Hn "nameserver" {} \; 2>/dev/null:

    user@desktop ~ $ find /etc -type f -exec grep -Hn "nameserver" {} \; 2>/dev/null
    /etc/ppp/ip-up:24:              # merge the new nameservers with the other optio...
    /etc/ppp/ip-up:26:                      grep --invert-match '^nameserver[[:space...
    /etc/ppp/resolv.conf:1:nameserver 10.22.10.20
    ...

    Таким образом, команда grep может эффективно использоваться вместе с командой find для нахождения информации в файлах.

Задания для самостоятельного выполнения

  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. Какие утилиты для архивирования существуют в Linux?

  2. Какие основные различия между файловыми системами Ext2, Ext3 и Ext4?

  3. Как просмотреть информацию о файловой системе, включая индексные дескрипторы, блоки и размер блока?

  4. Как проверить, какие файловые системы уже смонтированы в системе Linux?

  5. Какую команду следует использовать для вывода 25 последних строк файла?

Last updated