关于为什么 touch、mv 等不会“根据需要”创建子目录

关于为什么 touch、mv 等不会“根据需要”创建子目录

除非某些子目录已经存在,否则许多 Unix 命令都会失败,尽管对于此类命令来说,在继续操作之前创建缺失的子目录是一件微不足道的事情。

例如,对于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

同样,对于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

这种行为的一个值得注意的例外是mkdir它本身,它的-p标志告诉它“根据需要创建子目录”。

touch我对、mv、 等人的事实感到有点困惑。不会做“明显的事情”,无论是默认情况下,还是根据某个标志(例如mkdirs -p)的请求。

我认为这一定有一个很好的理由,但对我来说并不明显。欢迎见解。

(问这个问题的动机是我想实现一个与(非标准)实用程序非常相似的实用程序mmv,除了与真实的相反mmv,它“根据需要创建子目录”,我想知道这个新功能是否是一个非常糟糕的主意。

例如,使用我正在考虑的实用程序(让我称之为它mmmv),人们将能够同时移动和重命名文件

1caf73ee55b4e11d6e3b12ccbf8c477c2839bfae
1f37fd8ce865f98579d10d8045ac1e88c6717215
73f2af84ba8ed27fa332d52745274377aa67cda5
a257a7c7cac26c391e8636193ff47b45c5e587ec

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

使用单个命令,如下所示:

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

为此,mmmv需要能够根据需要创建两个字母命名的子目录。)

答案1

一般来说,实用程序不这样做的原因是因为它不是预期的,并且这样做可能会产生安全隐患。

例如,假设您有一个应该是私有目录,/foo模式为700( rwx------)。如果存在touch /foo/bar/foo不存在,它将创建它,可能使用默认值755( rwxr-xr-x)。但/foo应该是私有的,而通常创建/foo并使其私有的任何内容都不会这样做。由于您不知道它/foo刚刚创建,因此您不知道需要去调整它。

相关内容