Существует Perl-утилита rename
(perldoc -f rename
), которая, если я правильно понял, является оберткой вокруг системного вызова rename
(man rename
-> Руководство по системным вызовам: RENAME(2)), и существует множество ее версий: https ://unix.stackexchange.com/q/730894
В то же время его справочная страница perldoc -f rename
, о которой уже упоминалось выше, неявно рекомендует, если я правильно понял, переименовывать файлы, используя вместо этого File::Copy
move
.
Верно ли мое понимание? То есть правильно ли, что лучше использовать move
вместо rename
? (Потому что: а) он более надежен, согласно perldoc -f rename
, б) нет путаницы с разными версиями.)
И если это правда, то почему Perl Cookbook в разделе «Переименование файлов» не упоминает move
, а вместо этого упоминает только rename
? Редактировать: Во второй части вопроса я на самом деле имею в виду: «Поскольку у нас уже есть move
, какой вообще смысл иметь rename
?»
File::Copy
реализует перемещение с помощью rename
, но с возвратом к копированию+отмене связи
Кроме того, TMTOWTDI - «программисты хотят проявлять творческий подход, и у них может быть много разных причин писать код определенным образом. То, для чего вы выбираете оптимизацию, — это ваша забота, а не моя»
«Поскольку у нас уже есть File::Copy, какой смысл вообще переименовывать?» Я считаю, что команда rename
более удобна, если вы просто хотите использовать однострочную команду для переименования файлов. (И вас не беспокоит переносимость на другие платформы)
Спасибо, ребята!
@jhnc perldoc rename
и rename --man
у меня почему-то не работает (у меня Perl 5.34.1, который поставляется с macOS). С другой стороны, perldoc -f rename
работает нормально. Вы имели в виду, что perldoc rename
означает другое rename
, чем perldoc -f rename
?
Да, модуль File::Copy
более универсален и надежен, чем команда rename
.
В учебнике говорится о команде rename
, потому что она на самом деле является частью языка, и если у вас есть двоичный код perl
, у вас есть доступ к команде rename
. Модуль является дополнительным, очень популярным и известным, но все же дополнительным. Чтобы использовать его, сначала необходимо use
его. Хоть он и установлен по умолчанию, но для использования в скрипте необходимо добавить строку use File::Copy;
.
У rename
есть проблемы, и они перечислены в документации. Но просто посмотрите на этот список. Как часто вам нужно переносить файлы с одной ФС на другую? Как часто вам нужно переименовывать открытые файлы?
На практике, хотя я и знаю о File::Copy
, у меня никогда не было в этом реальной необходимости. Все мое реальное взаимодействие с этим модулем сводилось к обслуживанию чужого кода. Конечно, моя обычная потребность в переименовании файлов не выходит за рамки ротации журналов/резервных копий. Или создайте временный файл, удалите исходный файл данных, переименуйте временный файл в исходный. Все, что более необычно, обычно представляет собой разовую задачу, которая не оправдывает написание сценария.
Итак, если ваши потребности в переименовании достаточно просты для команды rename
— действуйте. Если вы подозреваете, что rename
не сработает в вашей среде — используйте File::Copy
.
File::Copy
поставляется с Perl начиная с версии 5.002. Вы также можете считать это частью языка.
Это старый философский вопрос: является ли стандартная библиотека частью языка или нет?
Спасибо тебе огромное, Белая Сова! Сначала я спросил то же самое в Unix & Linux Stack Exchange, но все, что я получил, было насмешкой или чем-то похожим.
По поводу «Модуль File::Copy более универсален». Не совсем. Они оба могут сделать то, чего не может другой. rename
гарантирует, что имя всегда указывает на весь файл, а также гарантирует сохранение временных меток, прав собственности и разрешений. move
не дает таких гарантий, но может выполнять переименования и перемещения, а rename
не может.
Re «Если вы подозреваете, что rename
выйдет из строя в вашей среде — используйте File::Copy.», А если вы подозреваете, что move
вызовет проблемы в вашей среде — используйте rename
.
Выбор сводится к тому, хотите ли вы рискнуть скопировать и удалить (и связанные с этим проблемы) вместо простого переименования.
rename
просто меняет каталог или каталоги, вообще не касаясь файла. Как таковой,
File::Copy move
и mv
попытается использовать rename
, но вернется к копированию и удалению оригинала. Таким образом, даже если файл перемещается под другим именем или в другое место на том же томе, возможно следующее:
справочная страница для переименования (1) —
perldoc rename
илиrename --man