2009-06-26 4 views
13

В Perl, как я могу создать подкаталог и в то же время создать родительские каталоги, если они не существуют? Как команда mkdir -p UNIX?Как создать каталог и родительские каталоги в одной команде Perl?

+0

Добавил этот вопрос, чтобы я мог найти его снова в будущем, а не искать его каждый раз. По какой-то причине я всегда искал это в POSIX.pm. – skiphoppy

ответ

22
use File::Path qw(make_path); 
make_path("path/to/sub/directory"); 

Устаревшей mkpath и предпочтительным make_path вытекает из обсуждения в Perl 5 Porters нить, что заархивированы here.

Вкратце, тестирование Perl 5.10 показало неловкость в анализе аргументов интерфейса makepath(). Таким образом, он был заменен более простой версией, в которой в качестве конечного аргумента принимался хеш для установки параметров функции.

+3

@skiphoppy: Это все еще не «как команда mkdir -p UNIX», как указано в вопросе. mkdir's man page показывает -p, --parents no error if existing, make parent directories as needed Но make_path возвращает false, если каталог существует. (т. е. make_path "/ tmp/foo" или die; #will die if/tmp/foo существует) – Randall

3

Использование mkpath из модуля File :: Path:

use File::Path qw(mkpath); 
mkpath("path/to/sub/directory"); 
+1

Исследуя это сейчас, я вижу, что mkpath() устарел, а официальный интерфейс теперь make_path(). Если кто-то напишет подробное объяснение относительно того, что нас покупает, я сделаю это принятым ответом. – skiphoppy

3

Пожалуйста игнорируемых, если вы ищете Perl модуль с «MkDir -p» функциональность, но следующий код будет работать:

my $dir = '/root/example/dir'; 

system ("mkdir -p $dir 2> /dev/null") == 0 
    or die "failed to create $dir. exiting...\n"; 

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

+0

Этот подход имеет смысл, если вы хотите избежать установки модулей. Обычно я предпочитаю требовать установки модулей, которые мне нужны, или я отказываюсь поддерживать систему. :) Я предпочитаю использовать модули, поэтому я могу воспользоваться преимуществами тестирования и исследований, которые им попали, поэтому я могу избежать ошибок, таких как неспособность проверить системные вызовы или потерять вывод сообщений об ошибках, а также потому, что на них меньше накладных расходов для создания процесса. – skiphoppy

+0

Не создает ли зависимость от операционной системы? –

Смежные вопросы