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 é mkdir
ele próprio, cujo -p
sinalizador diz para "criar subdiretórios conforme necessário".
Estou um pouco intrigado com o fato de que touch
,, mv
et 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 mmv
utilitá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/bar
e /foo
não existir, ele será criado, potencialmente com um padrão de 755
( rwxr-xr-x
). Mas /foo
deveria ser privado, e tudo o que normalmente cria /foo
e torna privado não o fará. E como você não sabe que isso /foo
acabou de ser criado, você não sabe que precisa ajustá-lo.