移動コマンドを使用したらすべてのファイルが消えてしまいました

移動コマンドを使用したらすべてのファイルが消えてしまいました

すべてのデータを別のフォルダに移動していたのですが、1つのミスを犯してこのコマンドを実行しました

mv * /*

すべてのファイルが消えてしまいました。どうすれば見つけられますか? それとも削除されたのでしょうか?

答え1

のようなワイルドカードはすべて*シェルによって展開され、コマンドに渡されます。つまり、最初の星印は現在の作業ディレクトリ内のファイルに置き換えられ、2番目の星印は/内のすべてのファイルに置き換えられます。これを確認するには、次のコマンドを実行します。

echo /*

私のシステムでは、その結果は

/bin /boot /dev /etc /home /lib /lib64 /lost+found /media
/misc /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var

つまり、コマンドは次のようになります。

mv file1 file2 ... ... ... /tmp /usr /var

これにより、すべてが に移動します/var。もちろん、最後に何が保存されたかはシステムによって異なる場合があります。それが何であれ、おそらくそこにファイルが見つかるでしょう。

私はあなたが root として実行していたと仮定しています。そうでなかったら、/ 内のほとんどのディレクトリに書き込むことができず、何も起こらなかったでしょう。root として実行するときは特に注意し、可能な場合はそれを避けてください。

答え2

私はこれから良い観察をしました:

mkdir test; cd test; mkdir t1 t2 t3
cd ~/
mkdir testmove;
cd testmove;
touch abcd
mv * ~/test/*

ここで興味深いのは、ファイル「abcd」がディレクトリ t1 および t2 とともにディレクトリ t3 に移動される点です。

ls test
-> t3
cd t3
ls 
t1 t2 abcd

私が理解したのは、*と書くとコマンドが実際に展開されて実行されるので、mvコマンドは次のように展開されるということです。

mv abcd ~/test/t1 ~/test/t2 ~/test/t3

したがって、t3を宛先として、abcd、t1、t2をt3に移動しました。

あなたの質問に答えると、それは/の最後のディレクトリにあります

mvシンボリックリンクがある場合のマニュアルページから

Avoid specifying a source name with a trailing slash,
when it might be a symlink to a directory.  Otherwise, `mv' may do
something very surprising, since its behavior depends on the underlying
rename system call.  On a system with a modern Linux-based kernel, it
fails with `errno=ENOTDIR'.  However, on other systems (at least
FreeBSD 6.1 and Solaris 10) it silently renames not the symlink but
rather the directory referenced by the symlink.  *Note Trailing
slashes::.

ファイルを検索するにはfind / -type f -name <filename>

関連情報