誤って存在しない場所にファイルとフォルダーを移動する
質問
よく次のようなコマンドを実行します:
mv folder $something_that_does_not_exist
mv files* $something_that_does_not_exist
それから、ファイルがなくなったことに気付きました。フォルダー" $ something_that_does_not_exist"でもそれらを見ることができません。ファイルやフォルダはどこに行ったのですか?どうすれば元に戻すことができますか?
解決
この問題を防ぐために、 cp
または 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
が設定されていない場合、以下のコマンドは実行されません。
シェルがファイルを展開し、リストの最後のファイルが$ 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番目のファイルと同じ名前に変更するか、上記の別のエラーが発生します。
1)ディレクトリ「フォルダ」を移動しようとしています:
mv folder abcde
" abcde"の場合は既存のディレクトリで、「フォルダ」を移動します; 「abcde」へ。 「abcde」の場合既存のファイルである場合、コマンドは失敗します。それ以外の場合は、「フォルダ」の名前を変更します" abcde"へ。
2)いくつかのファイルを移動しようとしています:
mv files* abcde
" abcde"の場合は既存のディレクトリで、" files *"を移動します。 「abcde」へ。それ以外の場合、" files *"に一致するファイルが1つしかない場合は、そのファイルの名前を" abcde"に変更します。そうしないと、コマンドは失敗します。