이동 명령을 사용했는데 모든 파일이 사라졌습니다.

이동 명령을 사용했는데 모든 파일이 사라졌습니다.

모든 데이터를 다른 폴더로 옮겼고 1번 실수를 해서 이 명령을 실행했습니다.

mv * /*

이제 모든 파일이 사라졌습니다. 어떻게 찾을 수 있나요? 아니면 삭제되었나요?

답변1

모든 와일드카드 문자는 *셸에 의해 확장되어 명령에 전달됩니다. 이는 첫 번째 별표가 현재 작업 디렉터리의 파일로 바뀌고 두 번째 별표가 /에 있는 모든 파일로 바뀌는 것을 의미합니다. 이것을 실행하면 볼 수 있습니다

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물론, 정확한 마지막 항목은 시스템에 따라 다를 수 있습니다 . 그것이 무엇이든, 아마도 거기에서 파일을 찾을 수 있을 것입니다.

나는 당신이 루트로 실행되고 있다고 가정합니다. 이렇게 하지 않으면 /에 있는 대부분의 디렉터리에 쓸 수 없으므로 아무 일도 일어나지 않습니다. 루트로 실행할 때는 각별히 주의하고 가능하면 그렇게 하지 마십시오.

답변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>

관련 정보