Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Bash_etc

.pdf
Скачиваний:
11
Добавлен:
10.05.2015
Размер:
188.22 Кб
Скачать

$ mv copiedme movedme $ ls -i movedme

599231 movedme

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

Команда. mv, помимо возможности переименовать файлы, позволяет перемещать один или более файлов в другое место в иерархии директорий. Например, чтобы переместить /var/tmp/myfile.txt в директорию /home/username, следует выполнить:

$ mv /var/tmp/myfile.txt /home/username

После этого myfile.txt будет перемещен в /home/username/myfile.txt. И если /home/username располагается в другой файловой системе, нежели /var/tmp, команда mv скопирует myfile.txt в новую файловую систему и удалит его из старой. Когда myfile.txt перемещается между файловыми системами, то myfile.txt на новом месте получает новый номер инода. Это все потому, что у каждой файловой системы свой независимый набор номеров инодов.

Также можно воспользоваться mv для перемещения нескольких файлов в одну директорию. К примеру, чтобы переместить файлы /tmp/file1 и /tmp/file2 в /home/username, потребуется выполнить:

$ mv /tmp/file1 /tmp/file2 /home/username

Автодополнение и история команд в bash

Интерпретатор bash имеет очень мощное средство, упрощающее работу - автодополнение. При нажатии на клавишу Tab интерпретатор попытается дополнить уже введенный текст до предполагаемого (это может быть имя команды, имя объекта файловой системы, или даже параметры команд, имена процессов и многое другое, в зависимости от настроек системы). Повторное нажатие приводит к выводу возможных вариантов. Например, предположим, что в файловой системе есть два файла:

/filewithlongname1 и /filewithlongname2, а других объектов с именем, начинающимся на fi в корне нет.

В таком случае, чтобы набрать такое длинное имя файла, достаточно набрать 'fi', затем нажать клавишу Tab, после чего произойдет автодополнение до filewithlongname. Дополнить дальше интерпретатор не может, поскольку есть два подходящих объекта. Повторное нажатие приведет к выводу имен обоих файлов.

Попробуйте реализовать аналогичную ситуацию в директории /tmp.

Аналогично дополняются и вложенные объекты файловой системы, причем, если такой вложенный объект только один, то не обязательно вводить первые буквы его имени, достаточно просто нажать Tab, ведь других вариантов все-равно нет, и bash дополнит строку именем единственного файла или директории.

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

Интерпретатор bash сохраняет историю вводимых команд, и чтобы не набирать команду заново можно воспользоваться стрелками вверх и вниз для передвижения по истории введенных команд. Список всех сохраненных команд выводится по команде 'history'. После завершения bash сохраняет этот список в файл '~/.bash_history'.

Ссылки

В Linux существует два типа ссылок. Тип, о котором мы уже говорили ранее, при рассмотрении инодов, называется 'жесткие ссылки'. Каждый инод может иметь произвольное число жестких ссылок. Когда уничтожается последняя жесткая ссылка, и ни одна программа не держит файл открытым, то Linux автоматически удаляет его. Новые жесткие ссылки можно создать воспользовавшись командой ln:

$ cd /tmp

$ touch firstlink

$ ln firstlink secondlink

$ ls -i firstlink secondlink

15782 firstlink

15782 secondlink

Жесткие ссылки работают на уровне инодов, для указания конкретного файла. В Linux системах для жестких ссылок есть несколько ограничений. В частности, можно создавать жесткие ссылки только на файлы, но не на директории. Хотя '.' и '..' являются созданными системой жесткими ссылками на директории, Вам (даже от имени суперпользователя root) не разрешается создавать любые свои собственные. Второе ограничение жестких ссылок состоит в том, что нельзя связать ими несколько файловых систем. Это значит, что не получится создать жесткую ссылку с /usr/bin/bash на /bin/bash если директории / и /usr находятся в разных файловых системах.

В практике, символьные ссылки (символические, симлинки) используются гораздо чаще, чем жесткие. Симлинки - это файлы особого типа, которые ссылаются на другие файлы по имени, а не прямо по номеру инода. Они не спасают файлы от удаления. Если файл, на который указывает ссылка, исчезает, то симлинк перестает работать.

Символические ссылки можно создать передав для ln опцию

-s.

$ ln -s secondlink thirdlink

$ ls -l firstlink secondlink thirdlink

-rw-rw-r--

2

user user

0

Dec 31

19:08 firstlink

 

-rw-rw-r--

2

user

user

0

Dec

31

19:08

secondlink

lrwxrwxrwx

1

user

user

10

Dec

31

19:39

thirdlink

-> secondlink

В выводе ls -l символьные ссылки можно отличить тремя способами. Во-первых, обратите внимание на символ l в первой колонке. Во-вторых, размер символической ссылки равен количеству символов в ней (secondlink в нашем случае). В-третьих, последняя колонка в выводе показывает куда ведет ссылка с помощью интуитивного обозначения 'стрелкой'.

Символические ссылки в целом более гибкие, чем жесткие. Вы можете создавать символьные ссылки на любой объект файловой системы, включая директории. И благодаря тому, что их реализация основана на путях (не инодах), можно совершенно сво-

бодно создать символьную ссылку, указывающую на объект другой файловой системы.

Предположим, что мы хотим создать ссылку в /tmp, которая указывает на /usr/local/bin. Нам следует набрать:

$ cd /tmp

$ ln -s /usr/local/bin bin1 $ ls -l bin1

lrwxrwxrwx

1 root

root

14 Jan 1 15:42 bin1 -> /usr/local/bin

Либо, альтернативный вариант:

$ ln -s ../usr/local/bin bin2 $ ls -l bin2

lrwxrwxrwx

1 root

root

16 Jan 1 15:43 bin2 -> ../usr/local/bin

Как видно, обе символические ссылки указывают на одну директорию. Однако, если вторая символьная ссылка когда-ни- будь будет перемещена в другую директорию, то она может 'поломаться' из-за относительности пути:

$ mkdir mynewdir $ mv bin2 mynewdir $ cd mynewdir

$ cd bin2

bash: cd: bin2: No such file or directory

Не удается переместиться в bin2, потому, что директории /tmp/usr/local/bin не существует. Попробуйте произвести аналогичные действия с ссылкой bin1.

Удаление объектов файловой системы

Обычно, объекты из файловой системы удаляются с помощью команды rm. Чтобы удалить файлы, просто укажите их в командной строке:

$ cd

/tmp

file2

 

 

 

 

 

 

$

touch

file1

 

 

 

 

 

 

$

ls

-l

file1

file2

root

0

Jan

1

16:41

file1

-rw-r--r--

1

root

-rw-r--r--

1

root

root

0

Jan

1

16:41

file2

$ rm file1 file2

$ ls -l file1 file2

ls: file1: No such file or directory ls: file2: No such file or directory

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

$ rm -i file1 file2

rm: remove regular empty file `file1'? y rm: remove regular empty file `file2'? y

В примере выше команда rm запрашивает подтверждение на удаление каждого из указанных файлов. В случае согласия нужно будет вводить 'y' и нажать enter, дважды. Если бы вводилось 'n', то файл бы остался цел. Или, можно было бы нажать Control-C и сбросить выполнение команды rm -i целиком.

Для удаления директорий имеется два варианта. Вы можете удалить все объекты внутри директории и затем воспользоваться rmdir для удаления самой директории:

$ mkdir mydir

$ touch mydir/file1 $ rm mydir/file1

$ rmdir mydir

Такая сложность процесса объясняется тем, что rmdir не может удалить непустую директорию. Для рекурсивного удалаения всех вложенных объектов и самой директории используется команда rm с ключом -rf (от recursive force):

$ mkdir mydir

$ touch mydir/file1 $ rm -rf mydir

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

Шаблоны имен файлов/директорий

В повседневном использовании Linux часто случается, что нужно выполнить единичную операцию (например rm) на множестве объектов файловой системы за раз. В подобных ситуациях вписывать множество файлов в командную строку, зачастую, довольно обременительно:

$ rm file1 file2 file3 file4 file5 file6 file7

Для решения этой проблемы используется встроенная в Linux поддержка шаблонов. Она позволяет указать множество файлов за раз, используя специальные шаблонные символы. Bash и другие команды Linux интерпретируют этот шаблон просматривая диск в поисках файлов, которые ему удовлетворяют. Так, если у вас есть файлы file1 до file7 в текущей рабочей директории, то можете их удалить набрав:

$ rm file[1-7]

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

$ rm file*

Шаблонный символ '*' совпадает с любым символом или набором символов, или даже с их отсутствием.

Если необходимо перечислить все объекты файловой системы в /etc, начинающиеся с 'g', а также сам g, то можно ввести:

$ ls -d /etc/g*

/etc/gconf /etc/ggi /etc/gimp /etc/gnome

А сейчас о том, что случится если вы укажите шаблон, который не подходит ни под один объект файловой системы. В следующем примере мы попытались перебрать все файлы в /usr/bin, которые начинаются с 'asdf' и оканчиваются на 'jkl', потенциально включая и asdfjkl:

$ ls -d /usr/bin/asdf*jkl

ls: /usr/bin/asdf*jkl: No such file or directory

Когда задется шаблон, и если в него укладываются один или несколько файлов в подразумеваемой файловой системе, то bash заменяет шаблон на разделенный пробелами список всех подходящих объектов. Однако, когда с шаблоном нет совпадений, bash оставляет переданный аргумент как есть. Так вот, затем ls не может найти файл /usr/bin/asdf*jkl и выдает ошибку. Основное правило тут такое: шаблоны разворачиваются только если совпадают

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

Синтаксис шаблонов

Рассмотрим синтаксис шаблонов.

Символ '*' совпадает с нулевым или большим количеством символов. Фактически он означает: 'тут может быть все что угодно, включая и ничего'. Примеры:

/etc/g* совпадает со всеми файлами в /etc, начинающимися с g и самим файлом g;

/tmp/my*1 совпадает со всеми файлами в /tmp, которые начинаются с my и заканчиваются 1, включая файл my1.

Символ '?' означает один любой символ. Примеры:

myfile? совпадает с любым файлом, чье имя составляет myfile и следующим за этим какой-либо один символ;

/tmp/notes?txt совпадет, например, с /tmp/notes.txt и /tmp/notes_txt, если они существуют.

Шаблон '[]' подобен '?', но более точен. Чтобы его использовать, поместите любые нужные символы внутрь []. Полученное выражение будет удовлетворять любому одному из этих символов. Вы также можете воспользоваться '-', для указания диапазона, и даже комбинации диапазонов. Примеры:

myfile[12] совпадет с myfile1 и myfile2;

[Cc]hange[Ll]og совпадет с Changelog, ChangeLog, changeLog и changelog. Как можете заметить, использование скобочных шалонов очень удобно для указания вариантов с заглавными буквами;

ls /etc/[0-9]* покажет все файлы в /etc, начинающиеся с десятичной цифры;

ls /tmp/[A-Za-z]* отобразит все файлы в /tmp, которые начинаются с большой или маленькой латинской буквы.

Конструкция [!] эквивалентна конструкции [], за исключением того, что вместо совпадения с символами внутри скобок, она

удовлетворяет любому символу, который НЕ перечислен между [! и ]. Пример:

rm myfile[!9] удалит все файлы с названием myfile плюс один символ, кроме myfile9.

Шаблонные символы вне шаблонов

Поскольку bash обрабатывает шаблонные символы (?, [, ] и *) особым образом, нужно особенно позаботиться, когда пишется аргумент для команды, содержащий эти символы. Например, если Вы хотите создать файл, содержащий строку "[fo]*", то следующая команда может не дать желаемого результата:

$ echo [fo]* > /tmp/mynewfile.txt

Если шаблон [fo]* совпадет с какими-либо файлами в текущей рабочей директории, то вы обнаружите их имена внутри /tmp/mynewfile.txt, вместо ожидаемого [fo]*. Решение? Одним из них будет огородить ваши символы в одиночные кавычки, которые сообщат bash не делать никаких раскрытий шаблонов в них:

$ echo '[fo]*' > /tmp/mynewfile.txt

Также, Вы можете использовать экранирующий обратный косую черту (обратный слэш), чтобы сообщить bash, что [, ] и * должны интерпретироваться буквально, а не как шаблонные символы:

$ echo \[fo\]\* > /tmp/mynewfile.txt

Оба подхода (одиночные кавычки и экранирующая обратная косая черта) работают с одинаковым эффектом. Если нужно указать \ буквально, можно либо также взять ее в одиночные кавычки, либо набрать \\ (это будет обращено в \).

2. ВЫПОЛНЕНИЕ РАБОТЫ

Выполнение лабораторной работы предусматривает изучение основных сведений об интерпретаторе bash и командах работы с файловой системой, а также выполнение всех представленных примеров и заданий.

Защита лабораторной работы предполагает как устный опрос студента, так и проверку полученных навыков в рамках во-

просов, рассмотренных в работе. Умение выполнить приведенные контрольные задания и знание ответов на контрольные вопросы является обязательным.

3.КОНТРОЛЬНЫЕ ЗАДАНИЯ И ВОПРОСЫ

1.Создайте одной командой директорию /tmp/dir1/dir2/dir3

2.Удалите одной командой директорию /tmp/dir1/dir2/dir3

3.Перейдите в папку /usr/local/bin сделав не более 15 нажатий клавиш на клавиатуре

4.Создайте одной командой в домашней директории файл 1.txt, содержащий текущий путь

5.Удалите из /tmp все файлы (!!!), начинающиеся на 'a' и заканчивающиеся на 'b' без учета регистра одной командой

6.Удалите из /tmp все файлы (!!!), с именем длиной больше 3 символов одной командой

7.Выведете в терминал содержимое файла /etc/fstab

8.Скопируйте файл /etc/fstab в свою домашнюю директорию одной командой

9.Сколько инодов может быть у файла ?

10.Что делает команда echo ?

11.Что делает команда cd ?

12.Что делает команда ls ?

13.Что делает команда cat ?

14.Что делает команда cp ?

15.Что делает команда mv ?

16.В чем различие между жесткими и символическими ссылками ?

17.Приведите примеры имен, соответствующих шаблону *\** и не соответствующих ему

18.Могут ли в одной директории быть два различных файла с именами 'file' и 'File' ?

19.Что означает директория '..' ?

20.Как отличить символическую ссылку в выводе ls -l ?

21.Можно ли создать файл с именем '2*2=4' ? Ответ обоснуйте.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]