除非某些子目錄已經存在,否則許多 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
剛剛創建,因此您不知道需要調整它。