關於為什麼 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剛剛創建,因此您不知道需要調整它。

相關內容