О том, почему touch, mv и т. д. не создают подкаталоги «по мере необходимости»

О том, почему touch, mv и т. д. не создают подкаталоги «по мере необходимости»

Существует множество команд 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был только что создан, вы не знаете, что вам нужно пойти и настроить его.

Связанный контент