
すべてのデータを別のフォルダに移動し、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として実行されていると仮定します。そうしないと、/のほとんどのディレクトリに書き込むことができないため、何も起こりません。ルートとして実行するときは、特に注意し、可能であればそうしないでください。
答え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>