12

The command executed was "mv space *" in a folder with 14 GB of data.

mv *

du -hs 

is the same so where has the 14 GB of data gone? What have I done?

Peter Mortensen
  • 12,090
  • 23
  • 70
  • 90
user3032965
  • 131
  • 5
  • More information is needed. Which platform? – Jarmund Apr 18 '14 at 09:06
  • 4
    @Jarmund I think it's safe to assume some *nix, considering that both commands mentioned are common commands on Unix-like systems. In this regard, I think it's safe to say that most shells work the same. So we can deduce enough to give a useful answer even though the exact platform is not explicitly stated. – user Apr 18 '14 at 10:59
  • Related, if not a dupe with a hard-to-find-title: [I used mv ./*/* to flatten a directory on a ntfs filesystem, without add . to the end of the command, now all of my files are gone](http://superuser.com/questions/612505/i-used-mv-to-flatten-a-directory-on-a-ntfs-filesystem-without-add-to-th). – Arjan Apr 19 '14 at 16:03
  • Another pitfall to mention. You should NEVER run `mv` or `cp` with "*" on untrusted data. That is because "*" gets expanded, and files with names like "--verbose" get command-line arguments. What to use instead: `cp ./* anotherFolder` – VasyaNovikov Feb 27 '15 at 12:56

2 Answers2

31

My guess is that bash expands the wildcard, and thus moves every folder into your last one.

For example:

$ ls
test1  test2  test3  test4

$ mv *

$ ls
test4

$ ls test4
test1  test2  test3

Here, mv * is expanded to mv test1 test2 test3 test4 corresponding to mv [OPTION]... SOURCE... DIRECTORY format. Thus, every folder is moved into the last one.

ssssteffff
  • 2,389
  • 16
  • 17
  • 9
    This. By the way, if you want to use `*` in a `mv` (or `cp`) then have a look at their `--target-directory` switch. It ensures that you don't get bit by things like this. – user Apr 18 '14 at 10:58
2

As described by @ssssteffff, with mv *, the shell is doing wildcard expansion from files in current directory. However the behaviour of mv command depends on how many arguments * expands to. If there are more than two arguments, then the last argument must be a directory:

   mv [OPTION]... SOURCE... DIRECTORY

So,

I created 5 files

$ touch 1 2 3 4 5
$ ls
1  2  3  4  5
$ mv *
mv: target ‘5’ is not a directory
$ ls
1  2  3  4  5

Now if I create a directory which comes as a last parameter to wild-card expansion, then:

$ mkdir 6
$ mv *
$ ls
6
$ ls 6
1  2  3  4  5

You should double check what that last argument was.

  • If the last argument was a directory, then your data is perhaps safe.
  • If the total number of arguments were 2, and the last argument was a directory, then also your data is perhaps safe.
  • If the total number of arguments were 2, and the last argument was a file, then the second file is gone for sure.

Are you sure you didn't see the error something like this?

 mv: target ‘5’ is not a directory`
tuxdna
  • 134
  • 6