Sobre por que o touch, mv, etc. não cria subdiretórios “conforme necessário”

1

Existem muitos comandos Unix que falharão a menos que algum subdiretório já exista, mesmo que seja trivial para tais comandos ir em frente e criar o subdiretório faltando 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 , cujo -p sinalizador diz para "criar subdiretórios conforme necessário".

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

Eu acho que deve haver uma boa razão para isso, mas não é óbvio para mim. Insights são bem-vindos.

(A motivação para perguntar isso é que eu gostaria de implementar um utilitário que é bem parecido com o utilitário (não padrão) mmv , exceto que, ao contrário do mmv real, <<> / em> "criar subdiretórios conforme necessário", e estou querendo saber se esse novo recurso seria uma idéia realmente ruim.

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

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 precisa ser capaz de criar os subdiretórios de duas letras, conforme necessário.

    
por kjo 05.05.2014 / 18:30

1 resposta

1

Geralmente, a razão pela qual os utilitários não fazem isso é porque não é esperada, e pode haver implicações de segurança ao fazê-lo.

Por exemplo, digamos que você tenha um diretório que deveria ser privado, /foo , com o modo 700 ( rwx------ ). Se você fizer 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 o que normalmente cria /foo e torná-lo privado não o fará. E como você não sabe que /foo acabou de ser criado, você não sabe que precisa ajustá-lo.

    
por 05.05.2014 / 18:43