Warum Touch, MV usw. keine Unterverzeichnisse „nach Bedarf“ erstellen

Warum Touch, MV usw. keine Unterverzeichnisse „nach Bedarf“ erstellen

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 mkdires selbst, dessen -pFlag 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 ) mvdas „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) mmvDienstprogramm ziemlich ähnlich ist, außer dass es im Gegensatz zum mmvechtenwü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, mmmvmü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/barund /fooes nicht existiert, wird es erstellt, möglicherweise mit dem Standardwert 755( rwxr-xr-x). Es /foosollte aber privat sein, und was auch immer es normalerweise erstellt /foound privat macht, wird dies nicht tun. Und da Sie nicht wissen, dass es /foogerade erstellt wurde, wissen Sie nicht, dass Sie es anpassen müssen.

verwandte Informationen