私はよく次のようなコマンドを実行します。
mv folder $something_that_does_not_exist
mv files* $something_that_does_not_exist
その後、ファイルがなくなっていることに気付きます。「$something_that_does_not_exist」フォルダーでもそれらを見ることができません。ファイルとフォルダはどこに消えたのですか? どうすればそれらを取り戻すことができますか?
この問題を防ぐために、cp
orを使用するときは常にディレクトリ名の最後に / を追加する習慣がありmv
ます。
$ touch foo
$ mv foo bar/
mv: cannot move `foo' to `bar/foo': No such file or directory
末尾のスラッシュなしでmv
、ファイルの名前変更操作を行います。ファイルの名前が変更されていることがあります。
何も展開されない場合$something_that_does_not_exist
(ただし、それが問題かどうかはわかりません)、最初の mv は失敗します。2 番目の mv コマンドも"files*"
、ちょうど 2 つのファイルに展開しない限り、または最後のファイル名"files*"
がたまたまディレクトリに展開された場合に失敗します。その後、ファイルはそのディレクトリに移動されます。
コマンドがスクリプト内にあり、変数を展開しようとしたときにスクリプトを中止したいが、変数が設定されていない場合は、疑問符修飾子を使用できます。例:
$ echo ${DISPLAY?}; echo display
:0.0
display
$ echo ${MYTEST?}; echo mytest
bash: MYTEST: parameter null or not set
$
したがって、使用する場合
mv folder ${something_that_does_not_exist?}
が設定されてsomething_that_does_not_exist
いない場合、次のコマンドは実行されません。
1)ディレクトリ「folder」を移動しようとしました:
mv folder abcde
「abcde」が既存のディレクトリの場合、「folder」を「abcde」に移動します。「abcde」が既存のファイルの場合、コマンドは失敗します。それ以外の場合は、「フォルダー」の名前が「abcde」に変更されます。
2)いくつかのファイルを移動しようとしています:
mv files* abcde
「abcde」が既存のディレクトリの場合、「files*」を「abcde」に移動します。それ以外の場合、「files*」に一致するファイルが 1 つしかない場合は、そのファイルの名前が「abcde」に変更されます。そうしないと、コマンドは失敗します。
シェルがファイルを展開し、リストの最後のファイルが $something_that_does_not_exist と呼ばれるようになるため、ファイルを元に戻すことはできません。
リスト内の他のすべてのファイルは上書きされます。したがって、それらを取り戻すことはできません。
編集: Smoothwall VM (現在、私の手元にある唯一の GNU/Linux!) では、次のようになります。
$ mkdir t1
$ mv t1 t2
$ ls
t2/
$ mv t2 t1
$ cd t1
$ touch f1 f2 f3 f4
$ mv f* ../t2
mv: target `../t2' is not a directory
mv folder $something_that_does_not_exist
これはエラーになるはずです:
$ mkdir folder
$ mv folder
mv: Insufficient arguments (1)
Usage: mv [-f] [-i] f1 f2
mv [-f] [-i] f1 ... fn d1
mv [-f] [-i] d1 d2
他のケースは、何files*
が一致したかによって異なります。
mv files* $something_that_does_not_exist
最終的な一致がディレクトリである場合、ファイルがそこにある可能性があります。そうしないと、最初のファイルの名前を 2 番目のファイルと同じ名前に変更するか、上記の別のエラーが発生します。