Viele Unix-Befehle schlagen fehl, wenn nicht bereits ein Unterverzeichnis vorhanden ist. Dabei wäre es für solche Befehle ganz einfach, das fehlende Unterverzeichnis vor dem Fortfahren zu erstellen.
Zum Beispiel für 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
Gleiches gilt für 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
Eine bemerkenswerte Ausnahme von diesem Verhalten ist mkdir
es selbst, dessen -p
Flag es anweist, „Unterverzeichnisse nach Bedarf zu erstellen“.
Ich bin ein wenig verwirrt darüber, dass touch
, , et al. weder standardmäßig noch auf Anforderung über ein Flag (wie beispielsweise ) mv
das „Offensichtliche“ tun .mkdir
-p
Ich denke, dass es dafür einen sehr guten Grund geben muss, aber er ist mir nicht klar. Einblicke sind willkommen.
(Der Grund für diese Frage ist, dass ich ein Dienstprogramm implementieren möchte, das dem (nicht standardmäßigen) mmv
Dienstprogramm ziemlich ähnlich ist, außer dass es im Gegensatz zum mmv
echtenwürde„Erstellen Sie nach Bedarf Unterverzeichnisse“, und ich frage mich, ob diese neue Funktion eine wirklich schlechte Idee wäre.
Mit dem Dienstprogramm, an das ich denke – ich nenne es einfach mmmv
– könnte man beispielsweise die Dateien gleichzeitig verschieben und umbenennen.
1caf73ee55b4e11d6e3b12ccbf8c477c2839bfae
1f37fd8ce865f98579d10d8045ac1e88c6717215
73f2af84ba8ed27fa332d52745274377aa67cda5
a257a7c7cac26c391e8636193ff47b45c5e587ec
Zu
1c/af73ee55b4e11d6e3b12ccbf8c477c2839bfae
1f/37fd8ce865f98579d10d8045ac1e88c6717215
a2/57a7c7cac26c391e8636193ff47b45c5e587ec
73/f2af84ba8ed27fa332d52745274377aa67cda5
mit einem einzigen Befehl, etwa so:
% mmmv '??*' '#1#2/#3'
Damit dies möglich ist, mmmv
müssen bei Bedarf Unterverzeichnisse mit zweistelligen Namen erstellt werden können.)
Antwort1
Der Grund, warum Versorgungsunternehmen dies nicht tun, liegt im Allgemeinen darin, dass es nicht erwartet wird und dies Auswirkungen auf die Sicherheit haben kann.
Angenommen, Sie haben ein Verzeichnis, das privat sein soll /foo
, mit dem Modus 700
( rwx------
). Wenn Sie das tun touch /foo/bar
und /foo
es nicht existiert, wird es erstellt, möglicherweise mit dem Standardwert 755
( rwxr-xr-x
). Es /foo
sollte aber privat sein, und was auch immer es normalerweise erstellt /foo
und privat macht, wird dies nicht tun. Und da Sie nicht wissen, dass es /foo
gerade erstellt wurde, wissen Sie nicht, dass Sie es anpassen müssen.