Что значит рекурсивно в linux

Обновлено: 05.07.2024

Мой вопрос: почему при создании копии каталога необходимо использовать флаг -r (рекурсивный)? Т.е. зачем это делать:

Когда бы я не хотел такого поведения при копировании каталога?

Разве рекурсивная копия каталога не является поведением по умолчанию; поведение мы хотим почти все время?

Такое ощущение, что это лишний флаг.

Как работают файловые системы, каталог - это на самом деле не папка, содержащая файлы, а каталог, который представляет собой файл, содержащий указатели inode на «дочерние» файлы, связанные с ним. Это означает, что с точки зрения файловой системы файл - это файл, а каталог - это просто файл, содержащий список подключенных файлов.

Итак, с точки зрения командной строки, делая это:

В основном это означало бы копирование файла с именем dir1 в новый файл с именем copyDir1 . А что касается файловой системы, то dir1 в любом случае является просто файлом; тот факт, что это «каталог», будет очевиден только тогда, когда файловая система на самом деле проверяет dir1 чтобы увидеть, какова эта куча битов.

Флаг -r указывает файловой системе рекурсивно свернуть дерево файлов / каталогов и скопировать любое и все содержимое, которое может быть «потомком» этого файла, в новое место.

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

То есть, допустим, у вас есть файл

/bin в вашем домашнем каталоге, который вы хотите скопировать, но случайно пропустили

- потому что вы человек и делаете ошибки - так что просто /bin вот так:

Поскольку «сеть безопасности» /bin является каталогом в сочетании с необходимостью флага -r вы избежите случайного копирования всего двоичного корня системы, в которой вы находитесь, в ваш домашний каталог. Если бы эта сеть безопасности не существовала, произошла бы небольшая или, возможно, крупная катастрофа.

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

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

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

Точно так же именно поэтому файловые системы Linux/Unix не имеют разрешений 777 и прав sudo установленных по умолчанию, и то, как настоящие системные администраторы вздрагивают, когда пользователь устанавливает разрешения 777 или предоставляет всем права sudo . Это основные вещи, которые нужно сделать, чтобы система была стабильной и как можно более «пользовательской»; Любой, кто спешит замкнуть эти соглашения, скорее всего, нанесет ущерб их системе, даже не подозревая об этом.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Другой ответ здесь, на сайте Unix Stack Exchange, дает хорошее объяснение того, почему нерекурсивная копия каталога является проблематичной; акцент мой.

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

У меня вопрос: почему -r при создании копии каталога необходимо использовать флаг (рекурсивный)? Т.е. зачем это делать:

Когда бы я не хотел такого поведения при копировании каталога?

Разве рекурсивная копия каталога не является поведением по умолчанию; поведение мы хотим почти все время?

Такое ощущение, что это лишний флаг.

Разве вам не нужно копировать файлы и папки в нем тоже? Если вы думаете, что это будет улучшением, вы можете опубликовать этот запрос на канале разработчиков. В противном случае это, вероятно, было запрограммировано давным-давно. @blogger Это было запрограммировано давно, но по причине. Это означает, что если кто-то хочет выполнять основную работу в среде командной строки, его задача должна быть настолько простой, насколько трудно избежать сбоя системы. Это означает, что существуют веские причины, по которым существуют некоторые соглашения о взаимодействии пользователя с командной строкой. Я расширяю эту концепцию в своем ответе.

Как работают файловые системы, каталог - это на самом деле не папка, содержащая файлы, а каталог - это файл, который содержит указатели на узлы «дочерних» файлов, связанных с ним. Это означает, что с точки зрения файловой системы файл - это файл, а каталог - это просто файл, содержащий список подключенных файлов.

Итак, с точки зрения командной строки, делая это:

В основном означало бы скопировать указанный файл dir1 в новый файл с именем copyDir1 . А что касается файловой системы, то dir1 в любом случае это просто файл; тот факт, что это «каталог», будет очевиден только тогда, когда файловая система на самом деле проверяет, dir1 что это за куча битов на самом деле.

-r Флаг указывает файловую систему рекурсивно скатываются файл / дерево каталогов и копировать любые и все содержимое , которое может быть «ребенок» из этого файла на новое место.

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

То есть, допустим, у вас есть

/bin файл в вашем домашнем каталоге, который вы хотите скопировать, но случайно пропустили -

потому что вы человек и делаете ошибки - так оно /bin и есть:

С «сетью безопасности», /bin являющейся каталогом в сочетании с необходимостью -r флага, вы избежите случайного копирования всего двоичного корня системы, в которой вы находитесь, в ваш домашний каталог. Если бы эта сеть безопасности не существовала, произошла бы небольшая или, возможно, крупная катастрофа.

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

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

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

Точно так же именно поэтому файловые системы Linux / Unix не имеют 777 разрешений и sudo прав, установленных по умолчанию, и то, как настоящие системные администраторы вздрагивают, когда пользователь устанавливает 777 разрешения или предоставляет всем sudo права. Это основные вещи, которые нужно сделать, чтобы система была стабильной и как можно более «пользовательской»; любой, кто поспешит заморозить эти соглашения, скорее всего, нанесет ущерб их системе, даже не подозревая об этом.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Другой ответ здесь, на сайте Unix Stack Exchange, дает хорошее объяснение того, почему нерекурсивная копия каталога является проблематичной; Акцент мой.

Что ж, без флага -R возможно только копирование файлов, потому что довольно необычно, что кто-то хочет нерекурсивно копировать каталог: нерекурсивная копия просто привела бы ко второму имени для каталога, указывая непосредственно на та же структура каталогов. Поскольку это редко то, что люди хотят, и на самом деле существует отдельная программа, которая делает это (ln), нерекурсивная копия каталогов не допускается.

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

Я лично думаю, что «защитный» аспект этого не проходит тест на запах. Некоторые люди могут так же легко напечатать, cp -r /bin как cp-r

/bin . Сам флаг не предотвращает ошибок и не обязательно делает кого-то лучше, когда он осторожен. Если вы хотите предотвратить ошибки, команда cp может так же легко посмотреть на рассматриваемый узел и выдать подсказку, что-то вроде «Это каталог, хотите ли вы скопировать все содержимое в указанное место (y / п)?» Это было бы защитной сеткой . Требование -r для каталогов удерживает поток кода больше, чем что-либо еще.

Плохая аналогия с люком. Как сказал @JDL, рассматриваемый флаг не делает ничего, чтобы предотвратить опечатку в пути. Я был бы счастлив принять последовательность с другими командами в качестве причины, но у меня есть ощущение, что настоящая причина в том, что «так было написано в первый раз, и теперь многие вещи полагаются на такое поведение, изменить его невозможно». Если я не ошибаюсь, -r был расширением GNU - я не думаю, что у исторического cp UNIX была рекурсивная копия - и это было одной из причин команды rsync . @ Джейк, могу ли я понять основные понятия. Однако я не согласен с идеей, что флаг -r в рассматриваемой команде обеспечивает дополнительную безопасность. Исходя из моего опыта, команды командной строки linux исторически небезопасны. Безопасность была добавлена ​​сверхурочно, если вообще. Безопасность, присущая дизайну Linux, исходит от системы разрешений и отказа от запуска от имени пользователя root. Не запускаться с правами root также является соглашением, а не дизайном. Соглашение поддерживается в большинстве новых инсталляторов Linux, но не всегда.

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

Я думаю, что причины cp действуют так, как это имеет корни в философии Unix . Unix предпочитает программы, которые делают одно и делают это хорошо , а также программы, которые просты как по интерфейсу, так и по реализации (иногда их называют хуже, лучше ).

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

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

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

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

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


Закон Парето применим ко многим сферам, в том числе и к работе с терминалом Linux, ведь всего нескольких десятков команд позволит легко справляться с большинством задач. Мы выбрали 40 наиболее полезных команд, использование которых способно сильно облегчить жизнь при работе с Linux. Статья не претендует на статус истины в последней инстанции или максимально подробного руководства, а очередность команд обусловлена лишь алфавитным порядком.

Джентльменский набор команд Linux Часть 1:

1. alias

Команда alias создает «ярлык» другой команды или последовательности команд Linux.

Синтаксис команды alias:

alias позволяет:

Исправлять частые опечатки.

Использования команды alias для последовательности команд:

В данном алиасе команда ps используется для вывода списка запущенных процессов, в котором grep ищет процессы, соответствующие параметру $1.

Стоит отметить, что команда alias по умолчанию работает лишь для текущей сессии командной строки. Т.е. если разлогиниться или открыть другой терминал, то созданные алиасы перестанут работать. Чтобы сделать их постоянными необходимо включить их в свой локальный файл домашней директории

/.bashrc (в случае использования bash в качестве командной оболочки).

2. cat

Команда cat выводит содержание файлов в окне терминала.

cat позволяет:

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

Синтаксис команды cat:

Чтобы посмотреть содержимое файла .bash_log_out через терминал нужно ввести:

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

Основные опции cat:

  • -b — нумеровать только строки с содержимым;
  • -E — выводить $ в конец каждой строки;
  • -n — нумеровать все строки;
  • -s – удалять повторы пустых строк;
  • -T — выводить табуляции в виде ^I.

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

Синтаксис команды cd:

Чтобы перейти в подкаталог домашней папки нужно просто указать после команды название директории (img для примера):

Если нужно попасть в другой каталог нужно указать путь:

Чтобы быстро попасть в домашний каталог нужно указать вместо имени

Вернуться в предыдущую папку:

Перейти в родительский каталог:

Перемещение в родительский каталог текущего родительского каталога

4. chmod

Команда chmod устанавливает права доступа к файлу или каталогу.

chmod позволяет:

  • Разделить привилегии между пользователями.
  • Ограничить доступ к нежелательным файлам и папкам.
  • Контролировать доступные сервисам действия и прочее.

Синтаксис команды chmod:

Если вывести список папок и файлов командой ls с параметром –l, то можно увидеть нечто подобное:

Первый символ означает:

  • «-» — является файлом;
  • «d» — является каталогом.

Остальная часть строки в 9 символов разбивается на три группы по 3 символа в каждой:

  • Первые 3 символа – права доступа к файлам владельца (-rwx------).
  • Вторые 3 символа – права доступа к файлам группы (----rwx---).
  • Последние 3 символа – разрешения для других (-------rwx).

Если какой-то из символов отсутствует и вместо него указан «-», тогда нет доступа к данному действию.

Также задать права доступа можно с помощью цифр:

  • 0 – нет прав (-);
  • 1 – только выполнение (--x);
  • 2 – только запись (-w-);
  • 3 – запись и выполнение (w-x);
  • 4 – только чтение (r--);
  • 5 – чтение и выполнение (r-x);
  • 6 – чтение и запись (rw-);
  • 7 – чтение, запись и выполнение (rwx).

Например, у файла «ex.txt» указаны все права:

Нужно изменить их на:

  • Пользователь – все права (7 или rwx).
  • Группа – чтение и запись (6 или rw-).
  • Другим – чтение и выполнение (5 или r-x).

Тогда вводим следующую команду:

5. chown

Команда chown (change owner) позволяет менять владельца и группу владельца:

Синтаксис команды chown:

Если в поле пользователя указать группу через двоеточие (пользователь: группа), тогда изменится еще и группа.

Основные опции команды chown:

  • -c — детальный вывод всех выполняемых изменений;
  • -f — минимум информации (убирает ошибки из выдачи);
  • -h — изменять права символических ссылок, а файлы к которым они ведут не трогать;
  • -R — рекурсивная обработка всех подкаталогов;
  • -L — переходить по всем символическим ссылкам на директории.

Изменить владельца папки ex1 на user:

Изменить на владельца user и группу users:

Чтобы изменения применялись не только к данному каталогу, но и всем подкаталогам внутри, необходимо добавить опцию -R:

6. curl

Утилита curl извлекает информацию и файлы с url-страниц.

Будет полезна тем, кто часто загружает:

  • Скрипты.
  • Исполняемые файлы программ.
  • Архивы.

С помощью команды curl это можно делать не через браузер, а прямо из терминала, что дает возможность автоматизировать процесс.

На самом деле curl является не просто утилитой, а целым набором библиотек, способными реализовать все основные возможности по работе c передачей файлов и url-страницами.

Curl поддерживает работу с протоколами:

Синтаксис утилиты:

curl опции ссылка

Загрузка файлов с помощью curl

Самая распространенная задача для утилиты curl – это загрузка файлов. Чтобы скачать файл достаточно передать утилите имя файла или адрес страницы, например:

Таким образом содержимое файла будет отправлено на стандартный вывод. Для записи его в файл (для примера ex.txt) нужно ввести:

Чтобы скачанный файл назывался так же, как и на сервере необходимо использовать опцию -O:

Стоит отметить, что не во всех дистрибутивах Linux утилита предустановлена по умолчанию.

Команда df позволяет выводить:

  • Список подключенных устройств
  • Информацию о занятом месте
  • Точку монтирования

Синтаксис команды df:

Основные опции df:

  • -h — выводить размеры в читаемом виде Мбайтах или Гбайтах;
  • -x – исключить из вывода указанные файловые системы.

Например, необходимо получить информацию в читаемом виде для раздела /dev/sdb7, тогда вводим:

Чтобы игнорировать псевдо-файловые системы squashfs, создаваемые при установке приложения с помощью команды snap, вводим:

Лучший способ освоить новые команды – больше практиковаться, а лучше всего это делать на серверах компании AlexHost, где:

Или нет другого выхода, кроме как делать каталоги по одному?

Забавно, я смотрел на эту страницу, но полностью игнорировал «родителей», потому что думал о них как о детях (слева направо). Подсказка: в некоторых снарядах вы даже можете mkdir -p foo//zoo/andsoforth . Очень полезно! Лично я также упустил из виду «родителя» на странице руководства, потому что я чувствую, что флаг должен быть «-r» для «рекурсивного» - или, по крайней мере, должен быть псевдоним для такого, так как mkdir имеет только 6 Всего задокументированных флагов. Черт, я чувствую, что команда должна рекурсивно создавать каталоги по умолчанию, и если вы не хотите этого, вам следует указать это явно. Вместо этого они могли бы сделать -r, как и любую другую команду, невозможно запомнить конкретные параметры для каждой команды linux Но mkdir -p не кроссплатформенный, не работает в каждой оболочке @ РоманКоптев, mkdir -p как указано в стандарте POSIX , который ближе всего к тому , полностью портативный. Что лучше вы ожидаете в сценарии оболочки? @StephanBijzitter Да, это unix.se, а не unixandwindows.se. :)

Использование mkdir -p - это простой способ для большинства современных ОС:

Однако mkdir -p не рекомендуется во многих руководствах. Прочтите документацию по GNU make и autoconf о проблемах с использованием mkdir -p :

Кроссплатформенные системы установки и настройки имеют свои собственные безопасные альтернативы mkdir -p .

CMake для использования в командной строке оболочки:

Autoconf для использования в скрипте с предварительной обработкой:

Но эти решения требуют cmake или autoconf ( M4 ) инструментов для установки (и возможной предварительной обработки)

Вы также можете использовать install-sh скрипт с -d опцией:

Этот скрипт используется autoconf и automake проекта. Я думаю, что это должно быть самым безопасным решением.

В то время я искал кроссплатформенное решение для стандарта /bin/sh без зависимостей, но не нашел его. Поэтому я написал следующий скрипт, который может быть не идеальным, но я думаю, что он соответствует большинству кроссплатформенных требований :

Этот скрипт можно использовать для старых систем, где опция -p for mkdir отсутствует.

sed кросс-платформенная версия dirname была добавлена ​​в код. Он работает аналогично dirname (корректно с путем / , путями только с базовым именем, путями с завершающими / , путями с и без конечных \n s). Эта функция не может работать корректно, если путь содержит новые строки или некоторые недопустимые символы для текущей локали. Он также заменяет любую комбинацию / ( // , /// ) /

Изменена строка mkdir "$1" || return 1 на test -d "$1" || < mkdir "$1" || return 1; >потому что mkdir завершается с ошибкой, если путь существует, и эта проверка необходима для путей, содержащих конструкции, такие как aaa\. (Если aaa не существует, предыдущая версия создает, aaa а затем пытается создать ее снова).

Эта версия mkd не генерирует ошибку, если путь уже существует (но у нее все еще есть возможность генерировать такую ​​ошибку при параллельном выполнении) и не может получить несколько каталогов в командной строке.

Читайте также: