何らかのサブディレクトリが既に存在していないと失敗する 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
この動作の注目すべき例外の 1 つはmkdir
、-p
フラグによって「必要に応じてサブディレクトリを作成する」ように指示される 自体です。
、、などが、デフォルトでも、何らかのフラグ (など)を介した要求でも、「明らかなこと」を実行しないという事実にtouch
、私は少し困惑しています。mv
mkdir
-p
これにはきっと何か良い理由があるはずだと思っていますが、私にはよく分かりません。ご意見をお待ちしています。
(これを質問する動機は、(非標準の)ユーティリティとほぼ同じようなユーティリティを実装したいからですmmv
。ただし、実際のmmv
ユーティリティとは逆に、だろう「必要に応じてサブディレクトリを作成する」という機能があり、この新しい機能は本当に悪いアイデアなのだろうかと思っています。
例えば、私が考えているユーティリティを使えばmmmv
、ファイルの移動と名前の変更を同時に行うことができます。
1caf73ee55b4e11d6e3b12ccbf8c477c2839bfae
1f37fd8ce865f98579d10d8045ac1e88c6717215
73f2af84ba8ed27fa332d52745274377aa67cda5
a257a7c7cac26c391e8636193ff47b45c5e587ec
に
1c/af73ee55b4e11d6e3b12ccbf8c477c2839bfae
1f/37fd8ce865f98579d10d8045ac1e88c6717215
a2/57a7c7cac26c391e8636193ff47b45c5e587ec
73/f2af84ba8ed27fa332d52745274377aa67cda5
次のように単一のコマンドで実行します。
% mmmv '??*' '#1#2/#3'
これを可能にするには、mmmv
必要に応じて 2 文字の名前のサブディレクトリを作成できる必要があります。
答え1
一般的に、ユーティリティがこれを行わない理由は、それが予期されておらず、これを行うとセキュリティに影響が出る可能性があるためです。
たとえば、/foo
モードが700
( rwx------
) である、プライベートであるはずのディレクトリ があるとします。ディレクトリ が存在しない場合はtouch /foo/bar
、/foo
そのディレクトリが作成され、デフォルト755
( rwxr-xr-x
) になる可能性があります。しかし/foo
、 はプライベートであるはずであり、通常、ディレクトリを作成し/foo
てプライベートにするものは何も作成しません。また、 が作成されたことに気付いていないため/foo
、調整する必要があることに気付きません。