Por que touch, mv, etc. não criam subdiretórios "conforme necessário"

Por que touch, mv, etc. não criam subdiretórios "conforme necessário"

Existem muitos comandos Unix que falharão, a menos que já exista algum subdiretório, mesmo que seja uma questão trivial para tais comandos prosseguirem e criarem o subdiretório ausente antes de prosseguir.

Por exemplo, para 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

Da mesma forma, para 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

Uma exceção notável a esse comportamento é mkdirele próprio, cujo -psinalizador diz para "criar subdiretórios conforme necessário".

Estou um pouco intrigado com o fato de que touch,, mvet al. não fará a "coisa óbvia", por padrão ou mediante solicitação por meio de algum sinalizador (como mkdir's -p).

Acho que deve haver uma razão muito boa para isso, mas não é óbvio para mim. Informações bem-vindas.

(A motivação para perguntar isso é que eu gostaria de implementar um utilitário que seja muito parecido com o mmvutilitário (não padrão), exceto que, ao contrário do real mmv, eleseria"crie subdiretórios conforme necessário" e estou me perguntando se esse novo recurso seria uma ideia realmente ruim.

Por exemplo, com o utilitário em que estou pensando - deixe-me chamá-lo mmmv- seria possível mover e renomear simultaneamente os arquivos

1caf73ee55b4e11d6e3b12ccbf8c477c2839bfae
1f37fd8ce865f98579d10d8045ac1e88c6717215
73f2af84ba8ed27fa332d52745274377aa67cda5
a257a7c7cac26c391e8636193ff47b45c5e587ec

para

1c/af73ee55b4e11d6e3b12ccbf8c477c2839bfae
1f/37fd8ce865f98579d10d8045ac1e88c6717215
a2/57a7c7cac26c391e8636193ff47b45c5e587ec
73/f2af84ba8ed27fa332d52745274377aa67cda5

com um único comando, assim:

% mmmv '??*' '#1#2/#3'

Para que isso seja possível, mmmvé necessário criar subdiretórios com nomes de duas letras, conforme necessário.)

Responder1

Geralmente, o motivo pelo qual os utilitários não fazem isso é porque isso não é esperado e pode haver implicações de segurança ao fazer isso.

Por exemplo, digamos que você tenha um diretório que deveria ser privado, /foo, com modo 700( rwx------). Se você existir touch /foo/bare /foonão existir, ele será criado, potencialmente com um padrão de 755( rwxr-xr-x). Mas /foodeveria ser privado, e tudo o que normalmente cria /fooe torna privado não o fará. E como você não sabe que isso /fooacabou de ser criado, você não sabe que precisa ajustá-lo.

informação relacionada