headermask image

Notice: Undefined variable: t in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15

Notice: Undefined variable: r in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15
Рекомендую: Фриланс-биржа | Кэшбэк-сервис | Интернет-бухгалтерия

LPI 101: GNU и UNIX команды. Простое управление файлами.

Просмотр каталогов

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

Просмотр записей каталогов

Если вы проработали предыдущий раздел, то создали каталог lpi103 в своем домашнем каталоге. Имена файлов и каталогов могут быть как абсолютными, что значит, что они начинаются с / так и относительными к текущему рабочему каталогу, что значит, что они не начинаются с /. Абсолютное имя файла или каталога состоит из /, за которым следует последовательность из 0 или больше имен каталогов, каждый из которых отделяется /, а затем конечного имени. Если вы знаете относительное имя файла или каталога, то просто соедините абсолютное имя текущего рабочего каталога, / и относительное имя. Например, каталог lpi103, который мы создали в прошлом разделе, был создан в моем домашнем каталоге /home/ian, поэтому его полный или абсолютный путь /home/ian/lpi103. Листинг 43 показывает три разных способа использования команды ls для просмотра списка файлов каталога.

Листинг 43. Просмотр записей каталога

[ian@echidna lpi103]$ pwd
/home/ian/lpi103
[ian@echidna lpi103]$ echo $PWD
/home/ian/lpi103
[ian@echidna lpi103]$ ls
sedtab text2 text4 text6 xab yab
text1 text3 text5 xaa yaa
[ian@echidna lpi103]$ ls "$PWD"
sedtab text2 text4 text6 xab yab
text1 text3 text5 xaa yaa
[ian@echidna lpi103]$ ls /home/ian/lpi103
sedtab text2 text4 text6 xab yab
text1 text3 text5 xaa yaa

Как вы видите, можно передать имя каталога в качестве параметра команде ls и она выдаст содержимое этого каталога.

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

На устройстве хранения файл или каталог представляет собой коллекцию блоков. Информация о файле содержится в inode, который хранит информацию о владельце, последнем времени доступа, размере, файл это или каталог, права доступа. Номер inode также известный как последовательный номер файла уникален в переделах определенной файловой системы. Мы можем использовать опцию -l (или –format=long ) для отображения некоторой информации, хранящейся в inode.

По умолчанию команда ls не выводит специальные файлы, чьи имена начинаются с точки (.). У каждого каталога, кроме корневого, есть две специальных записи — это сам каталог (.) и родительский каталог (..). У корневого каталога отсутствует родительский каталог.

Листинг 44 использует опции -l и -a для отображения длинного формата списка всех файлов, включая записи. и .. .

Листинг 44. Расширенный формат вывода

[ian@echidna lpi103]$ ls -al
total 56
drwxrwxr-x 2 ian ian 4096 Sep 30 15:01 .
drwxr-xr-x 94 ian ian 8192 Sep 27 12:57 ..
-rw-rw-r-- 1 ian ian 8 Sep 26 15:24 sedtab
-rw-rw-r-- 1 ian ian 24 Sep 23 12:27 text1
-rw-rw-r-- 1 ian ian 25 Sep 23 13:39 text2
-rw-rw-r-- 1 ian ian 84 Sep 25 17:47 text3
-rw-rw-r-- 1 ian ian 26 Sep 25 22:28 text4
-rw-rw-r-- 1 ian ian 24 Sep 26 12:46 text5
-rw-rw-r-- 1 ian ian 98 Sep 26 16:09 text6
-rw-rw-r-- 1 ian ian 15 Sep 23 14:11 xaa
-rw-rw-r-- 1 ian ian 9 Sep 23 14:11 xab
-rw-rw-r-- 1 ian ian 18 Sep 23 14:11 yaa
-rw-rw-r-- 1 ian ian 7 Sep 23 14:11 yab

В Листинге 44, первая строка показывает общее число дисковых блоков (56), занимаемых выведенным на экран файлами. Оставшиеся поля расскажут о файле.

* Первое поле (drwxrwxr-x или -rw-rw-r– в этом случае) говорит нам о том, является ли запись обычным файлом (- ) или каталогом (d). Также вы можете увидеть символьные ссылки (l), о которых мы узнаем чуть позже или другие значения для специальных файлов (как например, для файлов в файловой системе /dev). За типом файла следует три набора прав доступа (как rwx или r–) для владельца, членов группы владельца и всех остальных. Три значения соответственно указывают пользователю, группе и всем остальным есть ли у них право на чтение (r), запись (w) или исполнение (x). Другие возможности использования как setuid будут рассказаны позже.
* Следующее числовое поле говорит нам число жестких ссылок на файл. Мы говорили, что inode содержит информацию о файле. Запись в каталоге о файле содержит жесткую ссылку (или указатель) на inode для этого файла, так, что у каждой записи в каталоге есть по крайней мере одна жесткая ссылка. У записей каталога есть дополнительная ссылка на запись . и по одной записи .. для каждого подкаталога. Из приведенного выше листинга видно, что у моего домашнего каталога есть несколько подкаталогов.
* Следующие два поля представляют владельца файла и группу, к которой он принадлежит. Некоторые системы, такие как Red Hat, по умолчанию каждому пользователю предоставляют свою группу. В других системах все пользователи могут быть в одной или нескольких группах.
* Следующее поле указывает размер файла.
* Предпоследнее поле указывает время последней модификации.
* Последнее поле содержит имя файла или каталога.

Опция -i команды ls отобразит для вас номера inode. Мы поговорим о них чуть позже, а также когда будем обсуждать жесткие и символьные ссылки в руководстве для темы 104.

Множество файлов

Вы также можете определить несколько параметров команде ls, каждый из которых будет или именем файла или каталога. Если имя представляет собой каталог, то команда ls отобразит содержимое этого каталога, а не саму запись о каталоге. В нашем примере, предположим мы хотим получить информацию о каталоге lpi103. Команда ls -l ../lpi103 отобразит нам список как в предыдущем примере. Листинг 45 покажет, как использовать ls -ld и как отобразить список записей для нескольких файлов и каталогов.

Листинг 45. Использование ls -d

[ian@echidna lpi103]$ ls -ld ../lpi103 sedtab xaa
drwxrwxr-x 2 ian ian 4096 Oct 2 18:49 ../lpi103
-rw-rw-r-- 1 ian ian 8 Sep 26 15:24 sedtab
-rw-rw-r-- 1 ian ian 15 Sep 23 14:11 xaa

Заметим, что время модификации lpi103 отличается от того, чтобы было в предыдущем листинге. Также как и в предыдущем листинге, время доступа файлов и каталогов изменено. Вы этого ожидали? Думаю, нет. Однако при разработке этого руководства я создал несколько дополнительных примеров, а затем удалил их, поэтому дата доступа каталога отражает этот факт. Мы поговорим об этом чуть позже, когда будем обсуждать поиск файлов.

Сортировка вывода

По умолчанию команда ls выводит файлы в алфавитном порядке. Для сортировки вывода существует множество опций. Например, ls -t отсортирует по дате модификации (от самой последней до самой старой), в то время как ls -lS отсортирует список по размеру (от самых больших к маленьким). Добавление -r приводит к сортировке в обратном порядке. Например, используем ls -lrt, чтобы вывести длинный список, отсортированный в обратном порядке по дате модификации. За подробностями обратитесь к man-страницам.

Копирование, перемещение и удаление

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

cp
используется для копирования одного или более файлов. Вы должны передать ей по крайней мере два аргумента, один (или более) источников, а второй имя цели. Если вы определите два имени файла, то первый будет скопирован во второй. Как источник, так и цель могут включать в себя пути. Если вы определите каталог как последнее имя, то можете определить множество файлов, которое будет в него скопировано. Все файлы будут скопированы из существующих месторасположений, а копии будут иметь те же имена, что и исходные файлы. Заметим, что здесь нет никаких предположений по умолчанию о том, является ли цель текущим каталогом как в операционных системах DOS и Windows.

mv
используется для перемещения или переименования одного или более файлов или каталогов. В общем случае имена, которые вы можете использовать, следуют тем же правилам, что и для копирования с помощью команды cp; вы можете переименовать один файл или переместить набор файлов в новый каталог. Так как имя это только запись в каталоге, которая связана с inode, то вас не должно удивлять, что значение inode не меняется за исключением, когда файл перемещается в другую файловую систему, в этом случае перемещение похоже на копирование, за которым следует удаление оригинала.

rm
используется для удаления одного или нескольких файлов. Мы коротко рассмотрим, как удалять каталоги.

Листинг 46 иллюстрирует применение cp и mv для создания резервных копий текстовых файлов. Мы также используем ls -i чтобы показать inode некоторых файлов.

1. Сначала скопируем text1 в text1.bkp.
2. Затем создадим подкаталог с помощью команды mkdir
3. Затем создадим вторую копию text1, на этот раз в созданном каталоге и покажем, что все три файла имеют разные inode.
4. Затем мы перемещаем text1.bkp в созданный каталог и после этого переименовываем. Хотя мы могли бы сделать с помощью одной команды, мы для примера используем две.
5. Мы проверяем снова значения inode, чтобы подтвердить, что text1.bkp с inode 2129019 больше не находится в каталоге lpi103, но, что это inode файла text1.bkp.1 в каталоге для резервных копий.

Листинг 46. Копирование и перемещение файлов

[ian@echidna lpi103]$ cp text1 text1.bkp
[ian@echidna lpi103]$ mkdir backup
[ian@echidna lpi103]$ cp text1 backup/text1.bkp.2
[ian@echidna lpi103]$ ls -i text1 text1.bkp backup
2128984 text1 2129019 text1.bkp
backup:
1564497 text1.bkp.2
[ian@echidna lpi103]$ mv text1.bkp backup
[ian@echidna lpi103]$ mv backup/text1.bkp backup/text1.bkp.1
[ian@echidna lpi103]$ ls -i text1 text1.bkp backup
ls: text1.bkp: No such file or directory
2128984 text1
backup:
2129019 text1.bkp.1 1564497 text1.bkp.2

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

-f или –force
заставит cp попытаться удалить существующую цель, если в нее нельзя записывать.

-i или –interactive
попросит интерактивно подтвердить попытку замещения существующего файла

-b или –backup
сделает резервную копию файлов, которые будут замещены.

Как обычно обращайтесь к man-страницам за более подробной информацией.

В Листинге 47 мы продемонстрируем копирование с резервированием, а затем удаление файлов.

Листинг 47. Резервирование копий и удаление файлов

[ian@echidna lpi103]$ cp text2 backup
[ian@echidna lpi103]$ cp --backup=t text2 backup
[ian@echidna lpi103]$ ls backup
text1.bkp.1 text1.bkp.2 text2 text2.~1~
[ian@echidna lpi103]$ rm backup/text2 backup/text2.~1~
[ian@echidna lpi103]$ ls backup
text1.bkp.1 text1.bkp.2

Заметим, что команда rm также принимает опции -i и -f. Как только вы удалил файл с помощью rm, у файловой системы к нему больше нет доступа. На некоторых системах по умолчанию есть псевдоним alias rm=’rm -i’ для пользователя root, чтобы помочь предотвратить случайное удаление файла. Это также полезная мысль, если вы боитесь случайно что-либо удалить.

Прежде чем мы закончим обсуждение, следует сказать, что команда cp по умолчанию создает новую дату создания для новых файлов. Владелец и группа нового файла такие же, как и у оригинала. Опция -p может использоваться для сохранения выбранных атрибутов. Заметим, что только root может сохранять права владения. Смотри man-страницы для получения подробной информации.

Mkdir и rmdir

Мы уже видели, как создать каталог с помощью mkdir.Теперь пойдем дальше и рассмотрим команду для удаления каталогов rmdir.

Mkdir

Положим, вы находитесь в каталоге lpi103 и хотите создать подкаталоги dir1 и dir2. Команда mkdir,как и другие рассмотренные команды, может создать несколько каталогов за один раз как показано в Листинге 48.

Листинг 48. Создание нескольких каталогов

[ian@echidna lpi103]$ mkdir dir1 dir2

Команда не выводит подтверждения об успешном выполнении, но вы можете использовать echo $?, чтобы проверить, что код выхода действительно 0.

Если вы хотите создать вложенные каталоги, как например d1/d2/d3, то ничего не выйдет, так ни d1 ни d2 не существуют. К счастью у mkdir есть опция -p, которая позволяет создать любое число родительских каталогов. Листинг 49 иллюстрирует это.

Листинг 49. Создание родительских каталогов

[ian@echidna lpi103]$ mkdir d1/d2/d3
mkdir: cannot create directory `d1/d2/d3': No such file or directory
[ian@echidna lpi103]$ echo $?
1
[ian@echidna lpi103]$ mkdir -p d1/d2/d3
[ian@echidna lpi103]$ echo $?
0

Rmdir

Удаление каталогов происходит с помощью команды rmdir. Снова, существует опция -p, позволяющая удалять родительские каталоги. С помощью rmdir вы можете удалить каталоги, только если они пустые. Мы рассмотрим другой способ сделать это, когда будем рассматривать рекурсивное манипулирование. Один раз, выучив как использовать команду rmdir, вы вряд ли будете часто применять ее в командной строке, но знать о ней, тем не менее, стоит.

Чтобы проиллюстрировать удаление каталогов, мы скопировали файл text1 в каталог d1/d2, так что теперь он больше не пуст. Затем мы использовали rmdir, чтобы удалить все каталоги, которые мы создали с помощью mkdir. Как вы видите, d1 и d2 не удаляться, потому как d2 не пуст. Другие же каталоги были удалены. Как только мы удалим копию text1 из d2, мы сможем удалить d1 и d2 простой командой rmdir -p.

истинг 50. Удаление каталогов

[ian@echidna lpi103]$ cp text1 d1/d2
[ian@echidna lpi103]$ rmdir -p d1/d2/d3 dir1 dir2
rmdir: `d1/d2': Directory not empty
[ian@echidna lpi103]$ ls . d1/d2
.:
backup sedtab text2 text4 text6 xab yab
d1 text1 text3 text5 xaa yaa
d1/d2:
text1
[ian@echidna lpi103]$ rm d1/d2/text1
[ian@echidna lpi103]$ rmdir -p d1/d2

Рекурсивное манипулирование

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

Рекурсивный просмотр

У команды ls есть опция -R (заглавная буква ‘R’) для просмотра списка каталога и его подкаталогов. Опция рекурсии применима только к именам каталогов; она не будет искать все файлы, положим ‘text1′, в дереве каталогов. Мы можете использовать другие опции, которые мы рассмотрели совместно с -R. Рекурсивный список каталога lpi103, включая значения inode, показан в Листинге 51.

Листинг 51. Рекурсивный просмотр каталогов

[ian@echidna lpi103]$ ls -iR ~/lpi103
/home/ian/lpi103:
1564496 backup 2128985 text2 2128982 text5 2128987 xab
2128991 sedtab 2128990 text3 2128995 text6 2128988 yaa
2128984 text1 2128992 text4 2128986 xaa 2128989 yab
/home/ian/lpi103/backup:
2129019 text1.bkp.1 1564497 text1.bkp.2

Рекурсивное копирование

Вы можете использовать опцию -r (или -R или –recursive ), чтобы сообщить команде cp о прохождении по всему дереву каталога источника и рекурсивно скопировать его содержимое. Чтобы предотвратить бесконечную рекурсию, сам исходный каталог может быть не скопирован. Листинг 52 показывает, как скопировать все в нашем каталоге lpi103 в подкаталог copy1. Мы используем ls -R, чтобы показать полученное дерево каталогов.

Листинг 52. Рекурсивное копирование

[ian@echidna lpi103]$ cp -pR . copy1
cp: cannot copy a directory, `.', into itself, `copy1'
[ian@echidna lpi103]$ ls -R
.:
backup sedtab text2 text4 text6 xab yab
copy1 text1 text3 text5 xaa yaa
./backup:
text1.bkp.1 text1.bkp.2
./copy1:
backup text1 text3 text5 xaa yaa
sedtab text2 text4 text6 xab yab
./copy1/backup:
text1.bkp.1 text1.bkp.2

Рекурсивное удаление

Мы упомянули ранее, что команда rmdir удаляет только пустые каталоги. Мы можем использовать опцию -r (или -R или –recursive ), чтобы заставить команду rm удалить как файлы так и каталоги, как показано в Листинге 53, где мы удаляем каталог copy1, который только что создали, а также его содержимое, включая каталог с резервными копиями и его содержимое.

Листинг 53. Рекурсивное удаление

[ian@echidna lpi103]$ rm -r copy1
[ian@echidna lpi103]$ ls -R
.:
backup text1 text3 text5 xaa yaa
sedtab text2 text4 text6 xab yab
./backup:
text1.bkp.1 text1.bkp.2

Если файлы не доступны вам для записи, то вы можете добавить опцию -f, чтобы принудительно удалить их. Так часто поступает пользователь root, при чистке системы, но будьте внимательны, так как можете потерять ценные данные, если будете невнимательны.

Шаблоны и подстановки

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

Чтобы решить эту проблему, используйте поддержку шаблонов, которая встроена в bash. Эта поддержка, также называемая “globbing” (потому что изначально она была реализована программой /etc/glob), позволит вам определить множество файлов с помощью шаблона.

Строка, содержащая любой из символов ‘?’, ‘*’ или ‘[', является шаблоном. Подстановка это процесс, в котором интерпретатор (или возможно другая программа) заменяет эти шаблоны на список путей, соответствующих шаблону. Соответствие осуществляется следующим образом.

?
означает один любой символ
*
соответствует любой строке, включая пустую строку.
[
представляет класс символов. Класс символов это непустая строка, завершенная ']‘. Соответствие означает совпадение с любым символом, заключенным в скобках. Есть несколько особых случаев.

  • Символы ‘*’ и ‘?’ означают сами себя. Если вы используете их в именах файлах, то вам следует заботиться об использовании кавычек или escapе-последовательностей.
  • Так как строка должная быть непустой, и завершатся знаком ‘]’, то вы должны помещать символ ‘]’ первым в строке, если хотите найти его соответствие.
  • Символ ‘-’ между двумя другими означает диапазон, который включает как эти два символа, так и все те, что находятся между ними. Например, [0-9a-fA-F] представляет собой множество шестнадцатеричных цифр, написанных в верхнем или нижнем регистрах. Чтобы найти соответствие для ‘-’, вы можете поместить его первым или последним в диапазоне.
  • Символ ‘!’ означает первый символ диапазона, который дополняет диапазон таким образом, что они не пересекаются. Например, [!0-9] означает любой символ кроме чисел от 0 до 9. Символ ‘!’ соответствует себе, если он не стоит в первой позиции. Помните, что ‘!’ также используется в истории интерпретатора, поэтому будьте внимательны.

Подстановка применяется отдельно к каждому компоненту имени пути. Вы не можете использовать ‘/’ для совпадения или включения его в диапазон. Вы можете использовать его в любом месте, чтобы определить множество файлов или имен каталогов, например, в командах ls, cp, mv или rm. В Листинге 54, мы сначала создаем несколько файлов со странными именами, а затем используем команды ls и rm с шаблонами.

Листинг 54. Примеры использования шаблонов

[ian@echidna lpi103]$ echo odd1>'text[*?!1]'
[ian@echidna lpi103]$ echo odd2>'text[2*?!]'
[ian@echidna lpi103]$ ls
backup text1 text2 text3 text5 xaa yaa
sedtab text[*?!1] text[2*?!] text4 text6 xab yab
[ian@echidna lpi103]$ ls text[2-4]
text2 text3 text4
[ian@echidna lpi103]$ ls text[!2-4]
text1 text5 text6
[ian@echidna lpi103]$ ls text*[2-4]*
text2 text[2*?!] text3 text4
[ian@echidna lpi103]$ ls text*[!2-4]* # Surprise!
text1 text[*?!1] text[2*?!] text5 text6
[ian@echidna lpi103]$ ls text*[!2-4] # More surprise!
text1 text[*?!1] text[2*?!] text5 text6
[ian@echidna lpi103]$ echo text*>text10
[ian@echidna lpi103]$ ls *\!*
text[*?!1] text[2*?!]
[ian@echidna lpi103]$ ls *[x\!]*
text1 text2 text3 text5 xaa
text[*?!1] text[2*?!] text4 text6 xab
[ian@echidna lpi103]$ ls *[y\!]*
text[*?!1] text[2*?!] yaa yab
[ian@echidna lpi103]$ ls tex?[[]*
text[*?!1] text[2*?!]
[ian@echidna lpi103]$ rm tex?[[]*
[ian@echidna lpi103]$ ls *b*
sedtab xab yab
backup:
text1.bkp.1 text1.bkp.2
[ian@echidna lpi103]$ ls backup/*2
backup/text1.bkp.2
[ian@echidna lpi103]$ ls -d .*
. ..

Примечания:

1. Дополнение совместно с ‘*’ может привести к неожиданным сюрпризам. Шаблон ‘*[!2-4]‘ соответствует длиннейшей части имени, за которым не следуют символы 2, 3 или 4, что соответствует как text[*?!1] так и text[2*?!]. Теперь оба сюрприза станут понятны.
2. Что касается ранних примеров ls,то если подстановка является именем каталога, а опция -d не указана, тогда будет выдано содержимое этого каталога (как в примере выше для шаблона ‘*b*’).
3. Если имя файла начинается с точки (.), то необходимо явно его указать для поиска соответствия. Заметим, что только последняя команда ls отобразила две специальных записи (. и ..).

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

Листинг 55. Сюрпризы при использовании шаблонов

[ian@echidna lpi103]$ echo text*
text1 text2 text3 text4 text5 text6
[ian@echidna lpi103]$ echo "text*"
text*
[ian@echidna lpi103]$ echo text[[\!?]z??
text[[!?]z??

Более подробно смотрите в man 7 glob. Вам требуется именно этот раздел, так как есть информация о glob в разделе 3. Лучший способ понять теорию это практика, поэтому используйте при любом случае шаблоны. Не забывайте проверять с помощью ls, что шаблон делает то, что нужно, до того как применять cp, mv или rm и не получать неожиданных результатов.

Использование touch

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

touch

Команда touch без опций принимает один или более файлов как параметры и изменяет дату модификации файлов. Обычно это то время, которое отображается при длинном формате вывода списка каталогов. В Листинге 56 мы используем старого друга echo для создания простого файла f1, а затем используем длинный формат вывода списка каталога для отображения времени модификации (или mtime). В этом случае текущее время и будет временем создания файла. Затем мы используем команду sleep, чтобы подождать 60 секунд и снова запустим ls. Заметим, что время у файла изменилось на минуту.

Листинг 56. Изменение времени модификации с помощью touch

[ian@echidna lpi103]$ echo xxx>f1; ls -l f1; sleep 60; touch f1; ls -l f1
-rw-rw-r-- 1 ian ian 4 Nov 4 15:57 f1
-rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1

Если вы определите имя файла, которого не существует, то touch просто создаст пустой файл, кроме случая, если вы не определите опцию -c или –no-create. Листинг 57 демонстрирует обе этих команды. Заметим, что создается только f2.

Листинг 57. Создание пустых файлов с помощью touch

[ian@echidna lpi103]$ touch f2; touch -c f3; ls -l f*
-rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1
-rw-rw-r-- 1 ian ian 0 Nov 4 16:12 f2

Команда touch может также изменить mtime файла на определенную дату и время с помощью опций -d или -t. Опция -d очень гибка в плане понимания различных форматов даты и времени, в то время как опция -t требует по крайней мере формата MMDDhhmm времени, а также опционального указания значений года и секунд. Листинг 58 содержит такие примеры.

Листинг 58. Установка mtime с помощью touch

[ian@echidna lpi103]$ touch -t 200511051510.59 f3
[ian@echidna lpi103]$ touch -d 11am f4
[ian@echidna lpi103]$ touch -d "last fortnight" f5
[ian@echidna lpi103]$ touch -d "yesterday 6am" f6
[ian@echidna lpi103]$ touch -d "2 days ago 12:00" f7
[ian@echidna lpi103]$ touch -d "tomorrow 02:00" f8
[ian@echidna lpi103]$ touch -d "5 Nov" f9
[ian@echidna lpi103]$ ls -lrt f*
-rw-rw-r-- 1 ian ian 0 Oct 24 12:32 f5
-rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1
-rw-rw-r-- 1 ian ian 0 Nov 4 16:12 f2
-rw-rw-r-- 1 ian ian 0 Nov 5 00:00 f9
-rw-rw-r-- 1 ian ian 0 Nov 5 12:00 f7
-rw-rw-r-- 1 ian ian 0 Nov 5 15:10 f3
-rw-rw-r-- 1 ian ian 0 Nov 6 06:00 f6
-rw-rw-r-- 1 ian ian 0 Nov 7 11:00 f4
-rw-rw-r-- 1 ian ian 0 Nov 8 2005 f8

Если вы затрудняетесь с определением даты, то можете использовать команду date. У нее также есть опция -d которая понимает те же форматы даты, что и touch.

Вы можете использовать опцию -r (или –reference) вместе с именем файла, чтобы сигнализировать, что touch (или date) следует использовать дату модификации существующего файла. В Листинге 59 содержатся некоторые примеры.

Листинг 59. Использование даты модификации существующего файла

[ian@echidna lpi103]$ date
Mon Nov 7 12:40:11 EST 2005
[ian@echidna lpi103]$ date -r f1
Fri Nov 4 15:58:27 EST 2005
[ian@echidna lpi103]$ touch -r f1 f1a
[ian@echidna lpi103]$ ls -l f1*
-rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1
-rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a

Система Linux записывает как время модификации файла, так и время доступа. Обе отметки совпадают по значению, когда файл создается, и обе сбрасываются, когда он изменяется. Время доступа изменяется, даже если файл не модифицировался. В нашем последнем примере с touch, мы рассмотрим время доступа. Опция -a (или –time=atime, –time=access или –time=use ) определяет, что время доступа должно быть изменено. Листинг 60 использует команду cat, чтобы прочесть файл f1 и отобразить его содержимое. Затем мы используем ls -l и ls -lu, чтобы отобразить время модификации и доступа соответственно для файлов f1 и f1a, который мы создали, используя f1 как ссылку. Затем мы сбрасываем время доступа f1 до f1a, используя touch -a.

Листинг 60. Время доступа и модификации

[ian@echidna lpi103]$ cat f1
xxx
[ian@echidna lpi103]$ ls -lu f1*
-rw-rw-r-- 1 ian ian 4 Nov 7 14:13 f1
-rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a
[ian@echidna lpi103]$ ls -l f1*
-rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1
-rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a
[ian@echidna lpi103]$ cat f1
xxx
[ian@echidna lpi103]$ ls -l f1*
-rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1
-rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a
[ian@echidna lpi103]$ ls -lu f1*
-rw-rw-r-- 1 ian ian 4 Nov 7 14:13 f1
-rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a
[ian@echidna lpi103]$ touch -a -r f1a f1
[ian@echidna lpi103]$ ls -lu f1*
-rw-rw-r-- 1 ian ian 4 Nov 4 15:58 f1
-rw-rw-r-- 1 ian ian 0 Nov 4 15:58 f1a

За более полной информацией о принимаемых форматах времени и даты, смотри man или info страницы команд touch и date.

Поиск файлов

Последней темой этой части руководства будет команда find, которая используется для поиска файлов в одном или более дереве каталогов, на основе таких признаков как имя, дата модификации или размер. Снова, мы будем использовать каталог lpi103, который создали ранее в этом руководстве.

find

Команда find осуществляет поиск файлов или каталогов, используя все имя или его часть, или же другие критерии как размер, тип, владелец файла, дата создания или дата последнего доступа. Простейший поиск осуществляется по имени или его части. Листинг 61 демонстрирует каталог lpi103, в котором мы сначала ищем все файлы, имеющие в своем имени букву ’1′ или ‘k’, а затем производим поиск пути, который мы разъясним чуть ниже.

Листинг 61. Поиск файлов по имени

[ian@echidna lpi103]$ find . -name "*[1k]*"
./text1
./f1
./backup
./backup/text1.bkp.2
./backup/text1.bkp.1
./f1a
[ian@echidna lpi103]$ find . -ipath "*ACK*1"
./backup/text1.bkp.1
[ian@echidna lpi103]$ find . -ipath "*ACK*/*1"
./backup/text1.bkp.1

Замечания:

1. Шаблоны, которые вы можете использовать такие же, как мы видели в разделе ранее Шаблоны и подстановки.
2. Вы можете использовать -path вместо -name, чтобы находить полные пути, а не просто имена файлов. В этом случае шаблон может изменять компоненты пути.
3. Если вам нужен регистронезависимый поиск, как в примере с использованием ipath, предваряйте опции find, которые осуществляют по строке или шаблону, символом ‘i’
4. Если вы хотите найти файл или каталог, чье имя начинается с точки, как например .bashrc или текущий каталог (.), то тогда вы должны определить ведущей точку, как часть шаблона. В противном случае поиск будет игнорировать эти файлы и каталоги.

В первом примере выше мы искали как файлы, так и каталоги (./backup). Используйте параметр -type, а также однобуквенный тип, чтобы ограничить поиск. Используйте ‘f’ для регулярных файлов, ‘d’ для каталогов и ‘l’ для символьных ссылок. Смотри man-страницу find, чтобы узнать о других типах. На Листинге 62 представлен результат поиска в каталогах ( -type d ).

Листинг 62. Поиск файлов по типу

[ian@echidna lpi103]$ find . -type d
.
./backup
[ian@echidna lpi103]$ find . -type d -name "*"
./backup

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

Мы также можем искать файлы по размеру, как определенному (n) так и файлы, размер которых больше (+n) или меньше (-n) определенного значения. Используя как верхнюю, так и нижнюю границы, можно найти файлы, чьи размеры попадают в этот диапазон. По умолчанию опция -size команды find предполагает файл из ‘b’ 512-байт блоков. Среди других, можно выбрать ‘c’ для байт, ‘k’ для килобайт. В Листинге 63 мы ищем сначала все файлы размера 0, а затем все файлы, чей размер от 24 до 25 байт. Заметим, что определение -empty вместо -size 0 также заставляет искать пустые файлы.

Листинг 63. Поиск файлов по размеру

[ian@echidna lpi103]$ find . -size 0
./f2
./f3
./f4
./f5
./f6
./f7
./f8
./f9
./f1a
[ian@echidna lpi103]$ find . -size -26c -size +23c -print
./text1
./text2
./text5
./backup/text1.bkp.2
./backup/text1.bkp.1

В Листинге 63 рассматривается опция -print, которая является примером действия, которое может быть выполнено на результатом поиска. В bash shell это действие выполняется по умолчанию, если не определено иное. В некоторых системах и интерпретаторах действие обязательно, в противном случае вывода не будет.

Другие действия включают в себя -ls, которое печатает информацию о файле, аналогичную команде ls -lids или -exec, которое выполняет команду для каждого файла. Действие -exec должно заканчиваться точкой с запятой в виде escape-последовательности. Также используйте {}, если вы хотите, чтобы возвращаемый файл использовался в команде. Как мы видели раньше, фигурные скобки также интерпретируются, поэтому их надо либо заключать в кавычки, либо писать как escape-последовательность. Листинг 64 показывает как опции -ls и -exec могут использоваться для выдачи информации о файлах.

Листинг 64. Поиск файлов и действия над ними

[ian@echidna lpi103]$ find . -size -26c -size +23c -ls
2128984 4 -rw-rw-r-- 1 ian ian 24 Sep 23 12:27 ./text1
2128985 4 -rw-rw-r-- 1 ian ian 25 Sep 23 13:39 ./text2
2128982 4 -rw-rw-r-- 1 ian ian 24 Sep 26 12:46 ./text5
1564497 4 -rw-rw-r-- 1 ian ian 24 Oct 4 09:45 ./backup/text1.bkp.2
2129019 4 -rw-rw-r-- 1 ian ian 24 Oct 4 09:43 ./backup/text1.bkp.1
[ian@echidna lpi103]$ find . -size -26c -size +23c -exec ls -l '{}' \;
-rw-rw-r-- 1 ian ian 24 Sep 23 12:27 ./text1
-rw-rw-r-- 1 ian ian 25 Sep 23 13:39 ./text2
-rw-rw-r-- 1 ian ian 24 Sep 26 12:46 ./text5
-rw-rw-r-- 1 ian ian 24 Oct 4 09:45 ./backup/text1.bkp.2
-rw-rw-r-- 1 ian ian 24 Oct 4 09:43 ./backup/text1.bkp.1

Опция -exec используется для самых различных задач, ограниченных вашей фантазией. Например:

find . -empty -exec rm '{}' \;

удаляет все пустые файлы в дереве каталогов, в то время как

find . -name "*.htm" -exec mv '{}' '{}l' \;

переименует все файлы .htm в .html.

В наших последних примерах мы используем отметки времени модификации, описанные в команде touch, чтобы найти все файлы с определенной датой модификации. В Листинге 65 показаны три примера:

1. При использовании -mtime -2 команда find ищет все файлы, которые были модифицированы в течение последних двух дней. День в данном случае это 24 часовой период, отсчитывающийся от текущей даты и времени. Заметим, что вам следует использовать -atime, если вы хотите осуществить поиск файлов на основе времени доступа, а не времени модификации.
2. Указание опции -daystart гарантирует, что мы хотим рассматривать календарные дни, начало которых отсчитывается от полуночи. В этом случае файл f3 в результат не попадает.
3. Наконец, мы покажем, как использовать диапазон в минутах, а не днях, чтобы найти файлы, модифицированные межу одним часом (60 минут) и 10 часами (600 минут) ранее.

Листинг 65. Поиск файлов по временным отметкам

[ian@echidna lpi103]$ find . -mtime -2 -type f -exec ls -l '{}' \;
-rw-rw-r-- 1 ian ian 0 Nov 5 15:10 ./f3
-rw-rw-r-- 1 ian ian 0 Nov 7 11:00 ./f4
-rw-rw-r-- 1 ian ian 0 Nov 6 06:00 ./f6
-rw-rw-r-- 1 ian ian 0 Nov 8 2005 ./f8
[ian@echidna lpi103]$ find . -daystart -mtime -2 -type f -exec ls -l '{}' \;
-rw-rw-r-- 1 ian ian 0 Nov 7 11:00 ./f4
-rw-rw-r-- 1 ian ian 0 Nov 6 06:00 ./f6
-rw-rw-r-- 1 ian ian 0 Nov 8 2005 ./f8
[ian@echidna lpi103]$ find . -mmin -600 -mmin +60 -type f -exec ls -l '{}' \;
-rw-rw-r-- 1 ian ian 0 Nov 7 11:00 ./f4

Man-страницы команды find помогут вам изучить расширенный набор опций, который мы не можем рассмотреть в этом кратком введении.

Взято с ibm developerworks

Похожие посты
  • Описание более 350 команд Linux c примерами.
  • FreeBSD: Базовый курс
  • LPI 101: GNU и UNIX команды. Приоритеты исполнения процесса
  • Работа с файлами в Linux
  • LPI 101: GNU и UNIX команды. Редактирование файлов в vi
  • Управление динамическим пулом MAC-адресов в Hyper-V
  • Exchange Server 2010: Управление архивными ящиками, часть 2
  • Управление локальными групповыми политиками Windows Server 2008 Core Edition
  • Exchange Server 2010: Управление архивными ящиками, часть 1
  • Exchange Server 2010: Управление архивными ящиками, часть 3