Рекурсивно вывести содержимое файлов

#!/bin/sh

Линуксоид на велосипеде с моторчиком

Рекурсивные операции с файлами в Linux

Иногда возникает путаница между опциями -r и -R, каждая из которых в разных программах может означать рекурсивную обработку файлов в найденных каталогах. А может означать нечто совершенно противоположное или работать не так, как этого ожидал пользователь. Попробуем разобраться, в каких случаях что используется.

Эпиграф

— Это новый «Гарри Поттер». Я заказал версии для детей и взрослых, чтобы проверить, что в тексте нет различий.
Морис Мосс, The IT Crowd.

chmod

Ключ -r у chmod интерпретируется как «запретить всем чтение файла», а 755 в данном случае рассматривается как название файла, у которого изменяются права. Поскольку в подавляющем большинстве случаев файла с таким названием в текущей директории отсутствует, то команда возвращает ошибку.

chown, chattr, chgrp

У вышеперечисленных команд опция -r просто отсутствует. Для рекурсивной обработки директорий необходимо использовать опцию -R. Очевидно, так сделано из солидарности с «братской» командой chmod

Несмотря на то, что в странице документации cp из GNU coreutils сказано, что опции -r и -R равнозначны и означают рекурсивную обработку встречающихся директорий, опция -r, в отличие от -R, не соответствует стандарту POSIX и ее указание может повлечь за собой неожиданные последствия в случае, если очередной копируемый объект является чем-то отличным от обычного файла или директории (например, символической ссылкой, fifo или сокетом). В таких случаях некоторые реализации cp просто копируют содержимое ссылки/fifo, тогда как при -R такие объекты пересоздаются заново. Раньше такое поведение было присуще GNU cp, о чем до сих пор имеется свидетельство в русском man cp. Что касается более правильных (чем Linux) систем, то, например, в BSD-версии cp опция -r работает в «режиме совместимости», т.е. не создает символическую ссылку заново, а копирует содержимое в файл с тем же именем.

Читайте также:  Как чистить печку лимонной кислотой

Ключ -r команды ls означает «обратный порядок сортировки»
Правильно:

rm, grep

Зато в следующих случаях употребление -r/-R равнозначно:

Что касается grep, то, во-первых, обе опции не соответствуют POSIX (но, похоже, присутствуют во всех реализациях) Во-вторых, иногда возникает путаница между опциями -i (игнорировать регистр) и -I (пропускать двоичные файлы). Но это уже тема для другого разговора 🙂

Прочие команды

Поскольку команд, в том или ином виде поддерживающих рекурсивную обработку каталогов, набралось довольно много, то я попробовал свести их в одну таблицу.

команда -r -R
chacl рекурсия удаление ACL только с файлов
setfacl не поддерживается рекурсия
cvs номер ревизии рекурсия
diff рекурсия не поддерживается
gzip/gunzip рекурсия не поддерживается
zip рекурсия рекурсия, начиная с текущей директории (см. man zip, там есть существенная разница в обработке -r и -R)
rsync рекурсия использование относительных путей
wget рекурсия указывает список отвергаемых шаблонов

Заключение

Как видно, в большинстве случаев для указания рекурсии используется опция -r в нижнем регистре, в противовес стандартным утилитам, для которых характерно все же -R. Поэтому совет один: в случае сомнения смотрите в man, там все написано 🙂

Постскриптум

По абзацу про cp видно, что русская документация в некоторых дистрибутивах (не будем показывать пальцем на Debian и Ubuntu) не соответствует реальному положению дел. В частности, несмотря на то, что в jaunty используется GNU coreutis 6.10, русский man описывает cp версии 4.1. Желающие могут самостоятельно сравнить свою версию man 1 cp с локализованной. Другими словами, русская страница документации cp в силу своей древности вводит пользователя в заблуждение, т.е. врёт. По этой причине я рекомендую сделать apt-get remove manpages-ru.

2 комментария

    Comment by anon :

> По этой причине я рекомендую сделать apt-get remove manpages-ru

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

If from is not NULL, and the underlying protocol provides the source address, this source address is filled in.

Если параметр from не равен NULL, а сокет не является ориентированным на соединения, то адресотправителя в сообщении не заполняется.

scp неплохо было бы упомянуть. Нигде проблем с -r/-R не испытывал, только в scp почему-то постоянно пишу -R.

Источник

Рекурсивно вывести содержимое файлов

Чтобы просмотреть содержимое подкаталога `work’ в текущем каталоге, введите:

Чтобы просмотреть содержимое каталога `/usr/doc’, введите:

$ ls /usr/doc [Enter]

Из листинга по умолчанию Вы не сможете отличить каталоги и исполняемые файлы от обычных. Используйте ключ `-F’, который заставит ls поместить символ `/’ после имен подкаталогов и символ `*’ после имен исполняемых файлов:

В этом примере текущий рабочий каталог содержит исполняемый файл `repeat’, каталог `words’, и несколько файлов других типов `test1′ и `test2′.

Еще один способ просмотра содержимого каталогов — использование «менеджера файлов» , которых для Linux создано достаточно много; наиболее популярным является «Midnight Commander» или mc.

Чтобы вывести более подробный листинг каталога, используйте ls с ключом `-l’ («long»). Листинг будет содержать размер каждого файла в байтах, время последней модификации, тип файла, имя владельца и права доступа.

Для вывода подробной информации о каталоге `/usr/doc/bash’, введите: Первая строка содержит информацию о полном объеме занимаемого каталогом дискового пространства в блоках по 1024 байта (в данном случае 72). Каждая последующая строка содержит несколько колонок с информацией о каждом файле.

Первая колонка указывает тип файла и права доступа к нему. Первый символ в этой колонке определяет тип файла; тире (`-‘) означает обычный файл (по умолчанию). Каталоги обозначаются буквой `d’, а символические ссылки — буквой `l’. Остальные девять символов в первой колонке указывают права доступа к файлу. Вторая колонка указывает количество жестких ссылов на файл. Третья и четвертая колонки указывают пользователя и группу, которые владеют этим файлом. Пятая колонка содержит размер файла в байтах, шестая — время и дату последней модификации файла, а в последней колонке указано имя файла, к которому относится информация.

Чтобы просмотреть каталог рекурсивно, то есть со всеми содержащимися в нем подкаталогами, используйте опцию `-R’. Например, для текущего каталога введите: В данном примере текущий рабочий каталог содержит два подкаталога, `work’ и `play’, но не содержит файлов. Каждый из подкаталогов содержит файл `notes’.

Чтобы вывести полное оглавление все файловой системы, наберите:

Обычно этот ключ комбинируют с опцией `-l’, чтобы вывести наиболее полный листинг файлов системы:

Примечание: Некоторые каталоги могут не попасть в листинг, если у Вас нет права доступа к ним.

Чтобы отсортировать список файлов в каталоге по времени создания или модификации, используйте опцию `-t’. Например, чтобы вывести список файлов в каталоге `/usr/tmp’, чтобы самые новые файлы были вверху списка, введите:

$ ls -t /usr/tmp [Enter]

По умолчанию, ls не выводит имена файлов, начинающиеся с символа «точка» (`.’). Чтобы уменьшить листинг, многие приложения «скрывают» файлы конфигурации в Вашем домашнем каталоге, присваивая им имена, начинающиеся с точки; они называются dot-файлы, или «скрытые» . Каждый каталог имеет два специальных dot-файла: `..’ — родительский каталог и `.’ — сам этот каталог.

Чтобы увидеть все файлы в каталоге, включая скрытые, используйте опцию `-a’. Например, для текущего каталога:

Чтобы увидеть все файлы, исключая специальные `..’ и `.’, используйте опцию `’-A:

Чтобы увидеть цветной листинг каталога, используйте ls с ключом `—color’ ; тогда все имена файлов будут выведены разными цветами, в зависимости от их содержания. По умолчанию каталоги выводятся синим, текстовые файлы — белым, исполняемые — зеленым и т.д.

Примечание: Обычно для команды `ls -color’ создается псевдоним `ls’, так что листинг выводится в цвете по умолчанию.

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

В этом примере выводится дерево каталогов, в котором текущий каталог содержит два подкаталога `projects’ и `trip’; а каталог `projects’, в свою очередь, содержит подкаталоги `current’ и `old’.

Чтобы вывести дерево каталогов для определенного каталога, укажите его имя в качестве аргумента tree. Например, для Вашего домашнего каталога, введите:

Чтобы вывести дерево каталогов, в котором будут присутствовать только имена каталогов, используйте опцию `-d’. Это полезно при выводе полного дерева каталогов системы:

$ tree -d / > tree [Enter]

Команда ls имеет много опций для управления листингом и отображаемой информацией о файлах; приведенная таблица описывает некоторые из них.

Опция Описание
—color Вывод имен файлов в цвете, в зависимости от их типа.
-R Рекурсивный список файлов.
-a Вывод всех файлов, включая скрытые.
-d Вывод только имен каталогов, без промсмотра их содержимого.
-f Вывод содержимого каталога в том порядке, в котором оно записано на диск.
-l Подробный листинг.
-r Сортировка содержимого каталога в обратном порядке.
-s Вывод размера — в блоках по 1K — для каждого файла.
-t Сортировка по времени создания или модификации файла.

Примечание: Вы можете комбинировать опции в любом порядке; например, чтобы вывести список файлов, отсортированный по времени, со всеми атрибутами, введите `-lt’. Чтобы рекурсивно отобразить все скрытые файлы и их атрибуты, используйте `-lRa’. Порядок опций не имеет значения, так что `-lRa’ означает то же самое, что и `-alR’.

Next: Копирование файлов и каталогов Up: Работа с файлами Previous: Перемещение по каталогам Contents Index Alex Otwagin 2002-12-16

Источник

Вывод определенного списка файлов, сортировка

Помогите, пожалуйста, выполнить задания. Где не ищу объяснений, как это можно сделать, никак ничего не нахожу (возможно, я не там или не так ищу). Всё должно делаться в терминале Linux.

Выполнить, используя команды cat, wc, ls, head, tail, echo, sort, grep :

1. Подсчитать количество символов содержимого файлов в директории lucario6, отсортировать вывод по уменьшению количества, добавить вывод ошибок доступа в стандартный поток вывода

// Тут первую часть задания я сделал, но как добавить вывод ошибок доступа в стандартный поток вывода?

2. Вывести рекурсивно список имен файлов в директории lucario6, список отсортировать по имени a -> z, добавить вывод ошибок доступа в стандартный поток вывода

// Здесь вопрос: Если я перешёл в директорию lucario6 и ввёл ls -R | sort, считается ли это за рекурсивный вывод и нужную сортировку?

3. Рекурсивно вывести содержимое файлов с номерами строк из директории lab0, имя которых начинается на ‘d’, строки отсортировать по имени a -> z, ошибки доступа перенаправить в файл в директории /tmp

Буду очень благодарен за помощь

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

Проверка наличия определенного списка файлов
ДОброго всем здравия. Извините за возможный оффтопик, но не смогла найти решения по темам.

Вывод списка учеников из определенного класса
Народ! Задали задание на курсах сделать электронный журнал. Проблема вот в чем: не знаю как.

Регулярное выражение для получения списка файлов определенного расширения
На С++ нужно из всех файлов выбрать те, которые, к примеру с раширением .txt, или .html Так вот.

Источник

Debian. Шпаргалка сисадмина. Работа с файлами и каталогами

Вторая статья из серии статей-шпаргалок, предназначенных для быстрого доступа к наиболее часто используемым командам. Как было описано в предыдущей — Debian. Шпаргалка сисадмина. Операции с пользователями — вся упомянутая информация является общедоступной и не представляет из себя чего-то уникального . Почти все это вы сможете найти в справочных страницах официального дистрибутива Debian 7.7, а на остальные источники даны ссылки.

Если интересуетесь ОС Debian, рекомендую обратиться к тегу Debian на моем блоге.

Debian. Шпаргалка сисадмина. Работа с файлами и каталогами

Команды сгруппированы по выполняемым изменениям.

Создание, изменение и удаление файлов и каталогов

Создать файл можно разными способами, в большинстве случаев я использую nano, если нужно создать текстовый файл и сразу в него что-то записать. В статье «Как создать пустой файл в Linux» есть аж 12 способов.

touch

Изменяет временные штампы файла

Небольшая выдержка из «манов»:

Если заданный файл еще не существует, то он создается (как пустой файл с правами доступа 0666, с учетом umask), если не задана опция -c.

Создание файла file_test01 в текущем каталоге:

touch file_test01

Создание файла с указанием метки времени:

touch -t 200701310846.26 file_test01

Можно указать и будущую дату.

Nano’s ANOther editor, an enhanced free Pico clone

Файл будет создаy в том случае, если будет не пустым.
Создание файла file_test02 в текущем каталоге:

nano file_test02

На мой взгляд nano — отличный универсальный редактор, который к тому же установлен в Debian по умолчанию. Если все же nano не подходит, можете воспользоваться vim, gedit или чем-то другим.

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

Создание пустого файла file_test03 в текущем каталоге:

> file_test03

Про создание файлов на этом все.

mkdir

Создать каталог testdir01 в /root/:

mkdir /root/testdir01

Создать каталог testdir02 в /root/ с полными правами доступа только у владельца, у остальных нет прав даже на чтение (о правах доступа см. ниже):

mkdir -m 700 /root/testdir02

-m — Устанавливает права доступа к создаваемым каталогам. Эти права могут быть заданы либо в символьном виде, как описано в chmod(1), либо в виде восьмеричного числа.

Для удаления файлов и каталогов можно воспользоваться командами ниже.

Удаляет файлы или каталоги

Удалить файл testfile01 из каталога /root/:

rm /root/testfile01

Каталог этой командой без дополнительных аргументов удалить не получится:

rm testdir01

rm: невозможно удалить «testdir01»: Это каталог

…но можно удалить каталог рекурсивно со всеми файлами, например, вот так:

rm -r testdir01

-r — Рекурсивное удаление дерева каталогов.

rmdir

Удаляет пустые каталоги

Удалить каталог testdir04 из текущего расположения:

rmdir testdir04

Непустые каталоги удалить не получится:

rmdir /root/testdir02

Придется использовать rm, как описано выше.

Копирование, переименование и перемещение файлов и каталогов

Перемещает (переименовывает) файлы

Переместить файл file_primer03 из каталога /root/ в каталог /root/testdir02/, при этом задать ему новое имя — fileprimer031:

mv /root/file_primer03 /root/testdir02/fileprimer031

Хотя для изменения имени файла существует и другая команда.

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

Копирование файлов и каталогов

Копирование файла test_file01 из текущего расположения в каталог testdir02:

cp test_file01 testdir02/test_file01

Рекурсивное копирование каталога testdir02 из текущего расположения в новый каталог testdir02_copy:

cp -r testdir02 testdir02_copy

Очень интересное описание параметра:

-r — Копировать каталоги рекурсивно; выполнять какие-то, неопределенные стандартом действия, когда попадаются объекты, не являющиеся обычными файлами или каталогами. (Так, разрешается, и фактически одобряется, наличие опции-r как синонима для -R. Однако, глупое поведение, которое проявляет версия cp в GNU 4.0 не запрещается.)

Просмотр и редактирование

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

Concatenate files and print on the standard output

Отображение содержимого файла test_file01:

cat test_file01

Объединение файла test_file01 с файлом test_file02, результат записывается в файл test_file03 в текущем расположении:

cat test_file01 test_file02 > test_file03

Sort lines of text files

Сомневаюсь, что у меня получится описать работу команды «sort» лучше, чем это сделано в статье «HuMan: sort«.

Output the first part of files

Отображение первых строчек файла test_file01 (по умолчанию последние 10 строчек):

head test_file01

Отображение первых 4 строчек файла test_file01:

head -n 4 test_file01

-n — print the first K lines instead of the first 10; with the leading -‘, print all but the last K lines of each file

Output the last part of files

Отображение последних строчек файла test_file01 (по умолчанию последние 10 строчек):

tail test_file01

Отображение последних 4 строчек файла test_file01:

tail -n 4 test_file01

-n — output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth

Read from standard input and write to standard output and files

Удобная команда, предназначеня для одновременного вывода информации на экран и в файл.

Отправка пяти эхо-запросов до узла ya.ru с выводом информации на экран и в файл ping_ya_c_5.ru:

ping -c 5 ya.ru | tee ping_ya_c_5.ru

О всех описанных выше командах можно подробнее прочитать в статье «Операции с файлами и фильтрация».

grep, egrep, fgrep, rgrep

Print lines matching a pattern

О данных командах, в частности речь идет о grep, в некотором будущем я планирую написать отдельную статью, т.к. модели их применения достаточно объемны.

ls, dir, vdir

Выводит содержимое каталога

Отобразить список файлов в текущем расположении:

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

Отобразить список файлов в текущем расположении рекурсивно:

ls -lR

-R — Рекурсивно выдавать список содержимого всех каталогов.

Подробнее о команде ls можно прочитать в статье «15 базовых примеров команды ls в Linux»

Поиск файлов

Search for files in a directory hierarchy

Поиск файлов, начинающихся на testf, с корневого каталога:

find / -name «testf*»

locate

Find files by name

Описание с официального сайта:

Команда updatedb создаёт индекс всех файлов и папок, имеющихся в системе. Команда locate позволяет быстро находить файлы в системе по этому индексу без необходимости сканирования всей файловой системы каждый раз. Также см. пакеты mlocate и slocate.

whereis

Locate the binary, source, and manual page files for a command

Команду удобно использовать для определения месторасположения исходных файлов, ман-страниц.
Информация о консольном редакторе nano:

whereis nano

which

Locate a command

Также прочитать подробнее о командах поиска можно в статье «5 способов поиска файлов в Linux, используя терминал.».

Другие команды

Помимо описанных выше существует множество других полезных команд, о которых можно прочитать ниже.

pwd — print name of current/working directory/

Очень полезная команда, которая наиболее часто используется вообще без каких-либо аргументов.

cd — используется для перехода между каталогами.

Для перехода в домашний каталог:

cd

Для перехода в каталог /usr/bin/:

cd /usr/bin/

Переход на один уровень вверх:

cd ..

ln — создает ссылки между файлами

du — оценка места на диске, занимаемого файлом

Вывести размер текущего каталога:

du -sh

-s — Выводить размеры только для указанных явно аргументов, а не для их подкаталогов.
-h — Добавлять букву размера, например M для двоичного мегабайта ( мебибайт’), к каждому размеру.

На этом пока все, по мере необходимости буду дополнять статью другими командами.

Помимо упомянутых выше, при написании статьи использовались следующие источники:

Источник

Оцените статью