- #!/bin/sh
- Рекурсивные операции с файлами в Linux
- Эпиграф
- chmod
- chown, chattr, chgrp
- rm, grep
- Прочие команды
- Заключение
- Постскриптум
- 2 комментария
- Рекурсивно вывести содержимое файлов
- Вывод определенного списка файлов, сортировка
- Debian. Шпаргалка сисадмина. Работа с файлами и каталогами
- Debian. Шпаргалка сисадмина. Работа с файлами и каталогами
- Создание, изменение и удаление файлов и каталогов
- touch
- mkdir
- rmdir
- Копирование, переименование и перемещение файлов и каталогов
- Просмотр и редактирование
- grep, egrep, fgrep, rgrep
- ls, dir, vdir
- Поиск файлов
- locate
- whereis
- which
- Другие команды
#!/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 для двоичного мегабайта ( мебибайт’), к каждому размеру.
На этом пока все, по мере необходимости буду дополнять статью другими командами.
Помимо упомянутых выше, при написании статьи использовались следующие источники:
Источник