Как работают файловые системы, каталог - это на самом деле не папка, содержащая файлы, а каталог, который представляет собой файл, содержащий указатели inode на «дочерние» файлы, связанные с ним. Это означает, что с точки зрения файловой системы файл - это файл, а каталог - это просто файл, содержащий список подключенных файлов.
Итак, с точки зрения командной строки, делая это:
$ cp dir1 copyDir1
В основном это означало бы копирование файла с именем dir1
в новый файл с именем copyDir1
. А что касается файловой системы, то dir1
в любом случае является просто файлом; тот факт, что это «каталог», будет очевиден только тогда, когда файловая система на самом деле проверяет dir1
чтобы увидеть, какова эта куча битов.
Флаг -r
указывает файловой системе рекурсивно свернуть дерево файлов / каталогов и скопировать любое и все содержимое, которое может быть «потомком» этого файла, в новое место.
Теперь о том, почему это может показаться излишним или избыточным, это действительно сводится к историческим методам работы с файловыми системами. А также создание системы, которая защищена от всех типов ошибок, связанных с пользователем; случайный, а также преднамеренный.
То есть, допустим, у вас есть файл ~/bin
в вашем домашнем каталоге, который вы хотите скопировать, но случайно пропустили ~
- потому что вы человек и делаете ошибки - так что просто /bin
вот так:
cp /bin/ ~/copy_of_bin
Поскольку «сеть безопасности» /bin
является каталогом в сочетании с необходимостью флага -r
вы избежите случайного копирования всего двоичного корня системы, в которой вы находитесь, в ваш домашний каталог. Если бы эта сеть безопасности не существовала, произошла бы небольшая или, возможно, крупная катастрофа.
Логика здесь заключается в том, что в дни, предшествующие GUI (графические пользовательские интерфейсы), необходимо устанавливать логические / поведенческие соглашения, чтобы избежать создания пользователем ошибок, которые могут потенциально убить систему. И использование флага -r
теперь является одним из них.
Если это кажется излишним, то не нужно смотреть дальше, чем современная система графического интерфейса, которую можно поместить над файловыми системами Linux. Графический интерфейс пользователя решает основные пользовательские проблемы, подобные этой, позволяя легко перетаскивать файлы и каталоги.
Но в случае текстовых интерфейсов большая часть «пользовательского опыта» в этом мире - это, в основном, просто логические и основанные на практических условиях дорожные неровности, которые помогают держать пользователя под контролем, чтобы предотвратить потенциальную катастрофу.
Точно так же именно поэтому файловые системы Linux/Unix не имеют разрешений 777
и прав sudo
установленных по умолчанию, и то, как настоящие системные администраторы вздрагивают, когда пользователь устанавливает разрешения 777
или предоставляет всем права sudo
. Это основные вещи, которые нужно сделать, чтобы система была стабильной и как можно более «пользовательской»; Любой, кто спешит замкнуть эти соглашения, скорее всего, нанесет ущерб их системе, даже не подозревая об этом.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Другой ответ здесь, на сайте Unix Stack Exchange, дает хорошее объяснение того, почему нерекурсивная копия каталога является проблематичной; акцент мой.
Что ж, без флага -R возможно только копирование файлов, потому что довольно необычно, что кто-то хочет нерекурсивно копировать каталог: нерекурсивная копия просто привела бы ко второму имени для каталога, указывая непосредственно на та же структура каталогов.
Поскольку это редко то, что люди хотят, и на самом деле существует отдельная программа, которая делает это (ln), нерекурсивная копия каталогов не допускается.
Таким образом, если каталог - это просто файл с элементами inode, создание прямой копии этого файла будет эквивалентно тому, как будет работать жесткая ссылка. Что не то, что кто-то хочет.