Что такое Perl-эквивалент системной команды 'mv'? - PullRequest
1 голос
/ 07 июля 2010

У меня есть ниже "системная команда" для перемещения файла. Хорошо ли использовать команду File::Move или использовать приведенную ниже. Если File::Move лучше, как я могу его использовать?

system("mv $LOGPATH/test/work/LOGFILE  $LOGPATH/test/done/$LOGFILE") == 0
  or WriteLog(ERROR, "mv command Failed $LOGPATH/test/work/$LOGFILE  status was $?");

Ответы [ 3 ]

15 голосов
/ 07 июля 2010

Функция, которую вы ищете, находится в File :: Copy:

use File::Copy 'move';
move $x, $y or WriteLog ("move $x, $y failed: $!");

File :: Copy является частью стандартного дистрибутива самого Perl.

Конечно, вы можете использовать команду system ("mv ..."), чтобы сделать то же самое. Преимущества File :: Copy:

  • Он будет работать в разных операционных системах, что может быть необходимо, если вы пишете что-то для использования другими людьми;
  • Он не подвергает вас дырам в безопасности из-за передачи данных в оболочку или из-за ошибок переносимости, потому что путь к файлу содержит метасимволы и пробелы, такие как /Library/Application Support/Hi I'm On A Mac/;
  • Это быстрее: см. Шверновская паста . Стоимость system затопляет все остальное. File::Copy::move и rename имеют примерно одинаковую стоимость, поэтому вы также можете использовать более безопасный move, который работает в файловых системах.
8 голосов
/ 07 июля 2010

Вот еще одна вещь, которую нужно добавить в микс - если вы перемещаете файл в то же самое устройство (то есть нет необходимости перемещать содержимое файла, только обновить свою запись в каталоге), вы можете просто использовать встроенную функцию переименование

переименовать OLDNAME, NEWNAME

Изменяет имя файла; существующий файл NEWNAME будет затерт. Возвращает true для успеха, false в противном случае.

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

Для независимой от платформы функции перемещения посмотрите на Файл :: Копировать модуль.

3 голосов
/ 07 июля 2010

Чтобы добавить к отличному ответу Кинопико, одна из двух основных причин использовать команду File :: Copy поверх системы mv - помимо не всегда значимой, но все же значимой проблемы переносимости, которую он отметил, - тот факт, что вызов системной команды отменяет, по крайней мере, один дочерний процесс (и, если вы делаете какие-либо перенаправления, два из них - mv и оболочка). Это тратит много системных ресурсов по сравнению с File :: Copy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...