除非某些子目录已经存在,否则许多 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
、 等人的事实感到有点困惑。不会做“明显的事情”,无论是默认情况下,还是根据某个标志(例如mkdir
s -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
刚刚创建,因此您不知道需要去调整它。