Существует множество команд Unix, которые не будут выполнены, если какой-либо подкаталог еще не существует, хотя для таких команд было бы тривиальной задачей создать отсутствующий подкаталог перед продолжением работы.
Например, для touch
:
% touch /tmp/foo/bar/baz/frobozz
touch: cannot touch `/tmp/foo/bar/baz': No such file or directory
% mkdir -p /tmp/foo/bar/baz
% touch /tmp/foo/bar/baz/frobozz # succeeds
Аналогично, для mv
:
% mv --target-directory=/tmp/foo/frotz/quux /tmp/foo/bar/frobozz
% mv: failed to access `/tmp/foo/frotz/quux': No such file or directory
% mkdir -p /tmp/foo/frotz/quux
% mv --target-directory=/tmp/foo/frotz/quux /tmp/foo/bar/frobozz # succeeds
Одним из заметных исключений из этого поведения является mkdir
сам файл, -p
флаг которого сообщает ему «создавать подкаталоги по мере необходимости».
Я немного озадачен тем фактом, что touch
, mv
, и др. не делают «очевидную вещь» ни по умолчанию, ни по запросу с помощью какого-либо флага (например, mkdir
's -p
).
Я думаю, что для этого должна быть очень веская причина, но она для меня не очевидна. Приветствуются идеи.
(Мотивация задать этот вопрос заключается в том, что я хотел бы реализовать утилиту, которая во многом похожа на (нестандартную) mmv
утилиту, за исключением того, что, в отличие от настоящей mmv
, онабы«создавать подкаталоги по мере необходимости», и мне интересно, будет ли эта новая функция действительно плохой идеей.
Например, с помощью утилиты, о которой я думаю — назову ее так mmmv
— можно будет одновременно перемещать и переименовывать файлы
1caf73ee55b4e11d6e3b12ccbf8c477c2839bfae
1f37fd8ce865f98579d10d8045ac1e88c6717215
73f2af84ba8ed27fa332d52745274377aa67cda5
a257a7c7cac26c391e8636193ff47b45c5e587ec
к
1c/af73ee55b4e11d6e3b12ccbf8c477c2839bfae
1f/37fd8ce865f98579d10d8045ac1e88c6717215
a2/57a7c7cac26c391e8636193ff47b45c5e587ec
73/f2af84ba8ed27fa332d52745274377aa67cda5
с помощью одной команды, например такой:
% mmmv '??*' '#1#2/#3'
(Чтобы это было возможно, mmmv
необходимо иметь возможность создавать подкаталоги с двухбуквенными именами по мере необходимости.)
решение1
Обычно причина, по которой коммунальные службы этого не делают, заключается в том, что это не ожидается, и это может иметь последствия для безопасности.
Например, предположим, что у вас есть каталог, который должен быть приватным, /foo
, с режимом 700
( rwx------
). Если он есть touch /foo/bar
и /foo
не существует, он его создаст, потенциально со значением по умолчанию 755
( rwxr-xr-x
). Но /foo
он должен был быть приватным, и все, что обычно создает /foo
и делает его приватным, этого не сделает. И поскольку вы не знаете, что он /foo
был только что создан, вы не знаете, что вам нужно пойти и настроить его.