- Фундаментальные основы Linux. Часть II: Первые шаги в изучении интерфейса командной строки
- Глава 7. Работа с файлами
- Все имена файлов регистрозависимы
- Все является файлом
- Утилита file
- Утилита touch
- Утилита cp
- Утилита mv
- Утилита rename
- Практическое задание: работа с файлами
- Корректная процедура выполнения практического задания: работа с файлами
- Команда file в Linux
- Синтаксис и опции file
- Примеры использования file
- Выводы
- Файл и его имена: ссылки
- Жёсткие ссылки
- Индексные дескрипторы
- Символьные ссылки
Фундаментальные основы Linux. Часть II: Первые шаги в изучении интерфейса командной строки
Глава 7. Работа с файлами
Из данной главы вы узнаете о том, как определять тип файлов, создавать, удалять, копировать и перемещать файлы с помощью таких утилит, как file , touch , rm , cp , mv и rename .
Все имена файлов регистрозависимы
Имена файлов в Linux (или в любой системе Unix) являются регистрозависимыми. Это означает, что имена FILE1 и file1 не являются равноценными, а путь к файлу /etc/hosts отличен от пути к файлу /etc/Hosts (последнего файла не должно существовать в файловой системе типичного компьютера, работающего под управлением Linux).
Все является файлом
Любая директория на самом деле является файлом (с регистрозависмым именем!), хотя этот файл и имеет специальный тип. Каждый терминал (например, /dev/pts/4 ), любой жесткий диск или раздел на нем (например, /dev/sdb1 ) и любой процесс представлены где-либо в рамках файловой системы с помощью файла . После изучения данной главы у вас не останется сомнений в том, что в Linux все является файлом .
Утилита file
Утилита file использует файл со списком «магических последовательностей байт», содержащий шаблоны для распознавания типов данных. Файл со списком «магических последовательностей байт» расположен по пути /usr/share/file/magic . Используйте команду man 5 magic в случае необходимости получения дополнительной информации о нем.
Утилита touch
Создание пустого файла
Один из простых способов создания пустого фала заключается в использовании утилиты touch . (Позднее в данной книге мы рассмотрим множество других способов создания файлов.)
Команда touch -t
Удаление файлов навсегда
Утилита cp
Копирование отдельных файлов
Копирование файлов в другую директорию
Копирование множества файлов в директорию
Утилита mv
Переименование файлов с помощью утилиты mv
В том случае, если вам необходимо переименовать один файл, утилита mv является предпочтительным инструментом.
Переименование директорий с помощью утилиты mv
Утилита mv поддерживает параметр -i по аналогии с утилитами cp и rm .
Утилита rename
Об утилите rename
Утилита rename является одним из редких случаев, когда в рамках книги «Фундаментальные основы Linux» приходится делать разделение между дистрибутивами Linux. Практически каждая из описанных в данной книге утилит работает практически на каждом компьютере под управлением Linux. Но реализации утилиты rename в различных дистрибутивах отличаются.
Следует пытаться использовать утилиту mv всегда, когда вам необходимо переименовать несколько файлов.
Утилита rename в дистрибутиве Debian/Ubuntu
Утилита rename в дистрибутиве Debian имеет сложный синтаксис (используются регулярные выражения) для единовременного переименования множества файлов.
Утилита rename в дистрибутиве CentOS/RHEL/Fedora
Практическое задание: работа с файлами
1. Выведите список файлов директории /bin.
2. Выведите информацию о типах файлов /bin/cat, /etc/passwd и /usr/bin/passwd.
3a. Загрузите файлы wolf.jpg и LinuxFun.pdf с ресурса http://linux-training.be (с помощью команд wget http://linux-training.be/files/studentfiles/wolf.jpg и wget http://linux-training.be/files/books/LinuxFun.pdf)
3b. Выведите информацию о типах файлов wolf.jpg и LinuxFun.pdf.
3c. Переименуйте файл wolf.jpg в wolf.pdf (с помощью команды mv).
3d. Выведите информацию о типах файлов wolf.pdf и LinuxFun.pdf.
4. Создайте директорию
/touched и перейдите в нее.
5. Создайте файлы today.txt и yesterday.txt в директории touched.
6. Измените дату создания файла yesterday.txt таким образом, чтобы она совпадала с датой прошлого дня.
7. Создайте копию файла yesterday.txt с именем copy.yesterday.txt.
8. Переименуйте файл copy.yesterday.txt в kim.
9. Создайте директорию с именем
/testbackup и скопируйте все файлы из директории
10. Используйте одну команду для удаления директории
/testbackup и всех файлов из нее.
11. Создайте директорию
/etcbackup и скопируйте файлы с расширением .conf (*.conf) из директории /etc в нее. Проверьте, был ли осуществлен обход всех поддиректорий директории /etc?
12. Используйте утилиту rename для переименования всех файлов с расширением .conf (*.conf) таким образом, чтобы расширения всех этих файлов изменились на .backup. (Если у вас есть возможность работы более чем со одним дистрибутивом, попробуйте выполнить эту операцию во всех этих дистрибутивах!).
Корректная процедура выполнения практического задания: работа с файлами
1. Выведите список файлов директории /bin.
2. Выведите информацию о типах файлов /bin/cat, /etc/passwd и /usr/bin/passwd.
3a. Загрузите файлы wolf.jpg и LinuxFun.pdf с ресурса http://linux-training.be (с помощью команд wget http://linux-training.be/files/studentfiles/wolf.jpg и wget http://linux-training.be/files/books/LinuxFun.pdf)
3b. Выведите информацию о типах файлов wolf.jpg и LinuxFun.pdf.
3c. Переименуйте файл wolf.jpg в wolf.pdf (с помощью команды mv).
3d. Выведите информацию о типах файлов wolf.pdf и LinuxFun.pdf.
4. Создайте директорию
/touched и перейдите в нее.
5. Создайте файлы today.txt и yesterday.txt в директории touched.
6. Измените дату создания файла yesterday.txt таким образом, чтобы она совпадала с датой прошлого дня.
7. Создайте копию файла yesterday.txt с именем copy.yesterday.txt.
8. Переименуйте файл copy.yesterday.txt в kim.
9. Создайте директорию с именем
/testbackup и скопируйте все файлы из директории
10. Используйте одну команду для удаления директории
/testbackup и всех файлов из нее.
11. Создайте директорию
/etcbackup и скопируйте файлы с расширением .conf (*.conf) из директории /etc в нее. Проверьте, был ли осуществлен обход всех поддиректорий директории /etc?
Будут скопированы исключительно файлы с расширением .conf (*.conf), находящиеся непосредственно в директории /etc/.
12. Используйте утилиту rename для переименования всех файлов с расширением .conf (*.conf) таким образом, чтобы расширения всех этих файлов изменились на .backup. (Если у вас есть возможность работы более чем со одним дистрибутивом, попробуйте выполнить эту операцию во всех этих дистрибутивах!).
Источник
Команда file в Linux
Команда file — одна из самых полезных, поскольку позволяет узнать тип данных, которые на самом деле содержатся внутри документа. Если у вас есть какой-либо файл, взятый из ненадёжного источника, не поленитесь проверить его с помощью этой команды, прежде чем нажать кнопку Открыть. Возможно, такая предосторожность покажется лишней, но она оградит вас от «встречи» с нежелательным контентом.
В большинстве дистрибутивов Linux утилита file (работу которой и запускает одноимённая команда) входит в стандартный набор программного обеспечения.
Синтаксис и опции file
Синтаксис команды file достаточно простой. Записывать её в эмуляторе терминала или консоли следует так:
file опции название_документа
Что же касается опций, то их у этой команды несколько десятков. Мы рассмотрим лишь основные:
- -b, —brief — запрет на демонстрацию имен и адресов файлов в выводе команды;
- -i, —mime — определение MIME-типа документа по его заголовку;
- —mime-type, —mime-encoding — определение конкретного элемента MIME;
- -f, —files-from — анализ документов, адреса которых указаны в простом текстовом файле;
- -l, —list — список паттернов и их длина;
- -s, —special-files — предотвращение проблем, которые могут возникнуть при чтении утилитой специальных файлов;
- -P — анализ определенной части файла, которая обозначается различными параметрами;
- -r, —raw — отказ от вывода /ooo вместо непечатных символов;
- -z — анализ содержимого сжатых документов.
Для того, чтобы ознакомиться с полным списком опций, выполните в терминале команду:
Примеры использования file
Если вам нужно всего лишь посмотреть тип файла, использовать опции не обязательно. Достаточно прописать имя команды, а также название файла и путь к нему, при условии, что он находится не в корневой папке:
Случается, что нужно проверить не один, а несколько файлов. Чтобы не выполнять команду много раз подряд, перечисляйте названия всех файлов через пробел:
file /home/main-user/losst/test-file1.zip /home/main-user/losst/test-file2.tiff
Как видно на примере, картинки с расширениями gif и tiff в действительности оказались текстовыми документами, а архив с расширением zip — PDF документом. Кстати, команда file даёт возможность не только проверить, является ли архив архивом, но и заглянуть внутрь, чтобы узнать, что в нём содержится. Для этой цели используется опция -z:
file -z /home/main-user/losst/testarchive.zip
Как вы успели заметить, команда, возвращая ответ, постоянно выводит названия файлов, что в некоторых случаях бывает удобно, но зачастую только усложняет чтение результатов. Отключить эту функцию легко — воспользуйтесь опцией -b:
file -b /home/main-user/losst/test-file.gif /home/main-user/losst/test-file1.zip /home/main-user/losst/test-file2.tiff
Иногда нужно узнать не просто тип файла, а его MIME-тип. В таком случае на помощь приходит опция -i:
file -i -b /home/main-user/losst/fileA.sbin /home/main-user/losst/fileG.aspx /home/main-user/losst/fileH.lua
Нередко по каким-либо причинам утилита не может найти указанный файл: например, вы ошиблись буквой в его названии или неверно указали папку, в которой он находится. Тогда вывод информации об этом файле предваряет фраза cannot open. Впрочем, есть возможность видоизменить результат, добавив в него сообщение об ошибке. Для этого используйте опцию -E.
Сравните вывод команды с опцией -E и без неё:
file -E -b /home/main-user/losst/test-file1.zip /home/main-user/losst/test-file4.raw /home/main-user/losst/test-file.gif
file -b /home/main-user/losst/test-file1.zip /home/main-user/losst/test-file4.raw /home/main-user/losst/test-file.gif
Еще один способ работы с утилитой file — запись названий и адресов документов в простой текстовый файл. Применяя этот способ на практике, не забывайте добавлять к команде опцию —files-from, после которой указывайте имя файла, содержащего список документов, и путь к нему.
file —files-from /home/main-user/losst/list_of_files.txt
Выводы
Команда file помогает избежать ситуаций, когда вам приходится открывать подозрительные файлы, не будучи уверенными в их содержимом. Также вы можете использовать её для проверки содержимого нескольких архивов, если есть необходимость найти потерявшийся в большом массиве файлов документ, но нет желания просматривать все архивы вручную.
Источник
Файл и его имена: ссылки
Жёсткие ссылки
Каждый файл представляет собой область данных на жёстком диске компьютера или на другом носителе информации, которую можно найти по имени. В файловой системе Linux содержимое файла связывается с его именем при помощи жёстких ссылок. Создание файла с помощью любой программы означает, что будет создана жёсткая ссылка — имя файла, и открыта новая область данных на диске. Причём количество ссылок на одну и ту же область данных (файл) не ограничено, т. е. у файла может быть несколько имён.
Пользователь Linux может добавить файлу ещё одно имя (создать ещё одну жёсткую ссылку на файл) при помощи утилиты ln сокращение от англ. «link» — «соединять, связывать»). Первый параметр — это имя файла, на который нужно создать ссылку, второй — имя новой ссылки. По умолчанию ссылка будет создана в текущем каталоге.
[methody@localhost methody]$ ln examples/text text-hardlink
[methody@localhost methody]$ ls -lR
./:
drwxr-xr-x 3 methody methody 4096 Окт 16 04:45 examples
-rw-r—r— 2 methody methody 653 Окт 6 10:31 text-hardlink
./examples:
итого 92
-rw-r—r— 1 methody methody 84718 Окт 6 10:31 -filename-with-
-rw-r—r— 2 methody methody 653 Окт 6 10:31 text
Пример 12. Создание жёстких ссылок
Мефодий создал в своём домашнем каталоге жёсткую ссылку с именем « text-hardlink » на файл « text », который находится в подкаталоге « examples ». Выведя подробный список файлов текущего каталога и его подкаталогов (« ls -lR »), Мефодий обратил внимание, что у файлов « text » и « text-hardlink » совпадают и размер (« 653 »), и время создания. Это его совершенно не удивило, поскольку он знает, что теперь « /home/methody/text-hardlink » и « /home/methody/examples/text » — это два имени одного и того же файла. В подробном описании, выведенном командой « ls -l », Мефодию остались непонятны только два первых поля. Как объяснил Гуревич, первое «слово», состоящее из знаков « -drwx », — это обозначение прав доступа к файлу, о которых речь пойдёт в лекции Права доступа. А следующее за ним число — количество жёстких ссылок на данный файл или каталог. У « text » и « text-hardlink » стоит число « 2 » — у этого файла два имени.
Доступ к одному и тому же файлу при помощи нескольких имён может понадобиться в следующих случаях:
- Одна и та же программа известна под несколькими именами.
- Доступ пользователей к некоторым каталогам в системе может быть ограничен из соображений безопасности. Однако если всё же нужно организовать доступ пользователей к файлу, который находится в таком каталоге, можно создать жёсткую ссылку на этот файл в другом каталоге.
- Современные файловые системы даже на домашних персональных компьютерах могут насчитывать до нескольких десятков тысяч файлов и тысячи каталогов. Обычно у таких файловых систем сложная многоуровневая иерархическая организация — в результате пути ко многим файлам становятся очень длинными. Чтобы организовать более удобный доступ к файлу, который находится очень «глубоко» в иерархии каталогов, также можно использовать жёсткую ссылку в более доступном каталоге.
- Полное имя некоторых программ может быть весьма длинным (например, i586-alt-linux-gcc-3.3), к таким программам удобнее обрщаться при помощи сокращённого имени (жёсткой ссылки) — gcc-3.3.
Индексные дескрипторы
Поскольку благодаря жёстким ссылкам у файла может быть несколько имён, понятно, что вся существенная информация о файле в файловой системе привязана не к имени. В файловых системах Linux вся информация, необходимая для работы с файлом, хранится в индексном декрипторе. Для каждого файла существует индексный дескриптор: не только для обычных файлов, но и для каталогов, файлов-дырок и т. д. Каждому файлу соответствует ровно один индексный дескриптор.
Каталоги в Linux — тоже файлы особого типа, см. раздел Filesystem..Система файлов: каталоги
Индексный дескриптор — это описание файла, в котором содержится:
- тип файла (обычный файл, каталог, файл-дырка и т. д.);
- права доступа к файлу;
- информация о том, кому принадлежит файл;
- отметки о времени создания, модификации, последнего доступа к файлу;
- размер файла;
- указатели на физические блоки на диске, принадлежащие этому файлу — в этих блоках хранится «содержимое» файла.
Все индексные декрипторы пронумерованы, поэтому номер индексного дескриптора — это уникальный идентификатор файла в файловой системе — в отличие от имени файла (жёсткой ссылки на него), которых может быть несколько. Узнать номер индексного дескриптора любого файла можно при помощи всё той же утилиты ls с ключом -i :
[methody@localhost methody]$ ls -i ./text-hardlink examples/text
127705 examples/text 127705 ./text-hardlink
Пример 13. Информация об индексных дескрипторах файлов
Мефодий решил поинтересоваться номерами индексных дескрипторов файла « text » и жёсткой ссылки на него « text-hardlink » — он обнаружил, что эти номера совпадают (« 127705 »), то есть этим двум именам соответствует один индексный дескриптор, т. е. один и тот же файл.
Все операции с файловой системой — создание, удаление и перемещение файлов — производятся на самом деле над индексными дескрипторами, имена нужны только для того, чтобы пользователь мог легко ориентироваться в файловой системе. (Было бы очень неудобно запоминать многозначный номер каждого нужного файла или каталога.) Более того, имя (или имена) файла не указаны в его индексном дескрипторе. В файловой системе Ext2 имена файлов хранятся в каталогах: каждый каталог представляет собой список имён файлов и номеров их индексных дескрипторов. Жёсткую ссылку (имя файла, хранящееся в каталоге) можно представлять как каталожную карточку, на которой указан номер индексного дескриптора — идентификатор файла.
жёсткая ссылка Запись вида имя файла+номер индексного дескриптора в каталоге. Жёсткие ссылки в Linux — основной способ обратиться к файлу по имени.
Символьные ссылки
У жёстких ссылок есть два существенных ограничения:
- Жёсткая ссылка может указывать только на файл, но не каталог, потому что в противном случае в файловой системе могут возникнуть циклы — бесконечные пути.
- Жёсткая ссылка не может указывать на файл на другой файловой системе. Например, невозможно создать на жёстком диске жёсткую ссылку на файл, расположенный на дискете.
Причина этого ограничения в том, что номер индексного дескриптора уникален только в рамках одной файловой системы. В разных файловых системах могут оказаться два разных файла с одинаковым номером индексного дескриптора, в результате будет невозможно установить, на какой из них указывает жёсткая ссылка.
Чтобы избежать этих ограничений, были разработаны символьные ссылки. Символьная ссылка — это просто файл, в котором содержится имя другого файла. Символьные ссылки, как и жёсткие, предоставляют возможность обращаться к одному и тому же файлу по разным именам. Кроме того, символьные ссылки могут указывать и на каталог, чего не позволяют жёсткие ссылки. Символьные ссылки называются так потому, что содержат символы — путь к файлу или каталогу.
символьная ссылка Файл особого типа (« l »), в котором содержится путь к другому файлу. Если на пути к файлу встречается символьная ссылка, система выполняет подстановку: исходный путь заменяется на тот, что содержится в ссылке.
Символьную ссылку можно создать при помощи команды ln с ключом « -s » (сокращение от «symbolic»):
[methody@localhost methody]$ ln -s examples/text text-symlink
[methody@localhost methody]$ ls -li
127699 drwxr-xr-x 2 methody methody 4096 Окт 4 17:12 examples
127705 -rw-r—r— 2 methody methody 653 Сен 30 10:04 text-hardlink
3621 lrwxrwxrwx 1 methody methody 13 Окт 4 18:05 text-symlink -> examples/text
[methody@localhost methody]$
Пример 14. Создание символьных ссылок
Теперь Мефодий решил создать в своём домашнем каталоге и символьную ссылку на файл text и назвать её text-symlink . Команда ls -li отобразила этот файл совсем не так, как остальные: стрелочка («->») указывает, куда направлена ссылка. Кроме того, Мефодий обратил внимание, что номер индексного дескриптора (первое поле), размер и время создания файла text-symlink отличаются text-hardlink , а также во втором поле (количество жёстких ссылок на файл) text-symlink указано « 1 ». Все эти признаки недвусмысленно свидетельствуют о том, что text-symlink и text — это разные файлы. Однако если выполнить команду cat text-symlink , то на экран будет выведено содержимое файла text .
Символьная ссылка вполне может содержать имя несуществующего файла, в этом случае ссылка будет существовать, но не будет «работать»: например, если попробовать вывести содержимое такой «битой» ссылки при помощи команды cat , будет выдано сообщение об ошибке.
Узнать, куда указывает символьная ссылка, можно при помощи утилиты realpath :
[methody@localhost methody]$ realpath text-symlink
/home/methody/examples/text
Пример 15. Раскрытие символьных ссылок
Источник