Каталог (концептуально) - это специальный «файл», который содержит список имен и номера инодов, на которые указывают эти имена. Некоторые из имен могут быть подкаталогами. Существует специальная запись, ..
которая указывает на родительский каталог.
Итак, все понятно, изменить имя файла очень просто: вы просто меняете имя в записи каталога, больше ничего. Это определяет, является ли файл фактически файлом или «файлом», используемым для хранения содержимого другого каталога. Действительно, один и тот же rename
системный вызов делает оба.
Копирование, однако, является гораздо менее тривиальной операцией. Вы можете просто скопировать каталог «file», но тогда у вас будет две директории, в которых файлы одинаковы (это будут жесткие ссылки). Если бы у вас была система, которая допускает жесткие ссылки на каталоги, то так и было бы, но поскольку ни одна современная система не позволяет этого, по крайней мере, без полномочий root, вы должны сделать эту копию для каждого подкаталога. Вы можете запросить cp
это поведение с помощью cp -lR
: -l
для жесткой ссылки, -R
для этой рекурсии.
Но оставить все связанное, вероятно, не то, что вы хотите. Вместо этого вы хотите cp
скопировать каждый файл. Это довольно дорогая операция: каждый файл должен быть прочитан в память и записан на диск во втором месте. На самом деле для открытия, чтения, записи и закрытия файлов требуется несколько системных вызовов, и это должно повторяться для каждого файла.
Традиционные файловые системы также работают на диске. Нет никакого способа скопировать кучу файлов, кроме как просмотреть каждый из них по отдельности и скопировать его, и это те типы файловых систем, которые использовались при разработке основных утилит командной строки.
mv
переход из одной файловой системы в другую "просто измените имя в записи каталога"?rename
системный вызов не будет работать для кросс-файловой системы). Не уверен, что историческиmv
даже поддерживал перекрестные движения.mv
не поддерживала перемещения между устройствами. Раньше просто пыталсяrename()
и печатать сообщение об ошибке, если это не удалось. Я до сих пор помню шокированное чувство, которое я испытал в первый раз, когда случайно использовал новую функцию. Почему этот фильм занимает так много времени? О, это рекурсивная копия, которую я не собирался!mv
работала только для отдельных файлов на BSD 4.2 на VAX).Позвольте мне начать с того, чтобы задать еще один вопрос:
В чем разница между
cp
иcp -R
?Что ж, без
-R
флага возможно только копирование файлов, потому что довольно необычно, что кто-то хочет нерекурсивно копировать каталог: нерекурсивная копия просто привела бы ко второму имени для каталога, указывая непосредственно на тот же каталог структура. Поскольку это редко то, что люди хотят, и на самом деле есть отдельная программа, которая делает это (ln
), нерекурсивная копия каталогов не допускается.В чем тогда может быть разница между
mv
иmv -R
?mv a b
просто переименовывает одну запись в каталоге, поэтому, если каталогmv
редактируется, его содержимое также автоматически перемещается. В этом смыслеmv
уже предоставляется рекурсивное свойство, то есть «переименование» всех записей в переименованном каталоге, например, изa/1
вb/1
.mv
, Что не делает этого, то есть , который переименовывает каталогa
сb
, но держит ,a/1
какa/1
, это не то , что люди понимают , когда они относятся к перемещению что - то: При перемещении шкафа, содержимое шкафа перемещаются , а также. Эта другая операция, перемещающая каталог без его содержимого, также уже доступна, она называетсяmkdir
.источник
cp
иmv
называл их операциями: «сделать копию» и «переместить». Поэтому, если я захочу сделать копию чашки кофе, я бы хотел выпить еще одну чашку кофе с той же начинкой (кофейный напиток). Проблема в том, что инструменты предназначены не для «обычных людей», а для ботаников, которые осведомлены о структуре диска и файловой системы, а не о виртуальных объектах, таких как файлы и каталоги файлов.cp
иmv
тоже - она не требует какого - либо уровня «nerdness» , чтобы понять, просто здравый смысл. Настоящая копия чашки кофе - это не пустая чашка - вы должны рекурсивно копировать не только чашку, но и все ее содержимое (кофе). Однако, когда вы перемещаете чашку кофе, вам не нужно перемещать содержимое отдельно - содержимое перемещается вместе с контейнером естественным образом.Обычно, когда я путаюсь с логикой Unix, я смотрю на Plan9, чтобы увидеть, как изобретатели Unix реализовали те же самые задачи спустя годы, не останавливаясь на обратной совместимости.
Так что Plan9 предлагает
cp
иmv
инструменты для работы только с файлами.Для копирования dir есть
dircp
действительно@{cd fromdir && tar c .} | @{cd todir && tar xT}
(синтаксис rc shell)Для перемещения dir я думаю, что есть только
dircp d1 d2 && rm -r d1
Я думаю, что это решение ограничить
cp
и толькоmv
для файловых операций (не dirs) приносит большую ясность операциям на диске, и использованиеtar
для копирования файловых файлов очень удобно для понимания и написания сценариев.источник