1

Let's say I have a working directory:

/home/userID/workingDirectory

I type a mv command that will affect the parent directory of the current working directory and the working directory itself:

mv .* /tmp/someDirectory

When executed, the command moves the content of both directories /home/userID and /home/userID/workingDirectory because .* is a match of the .. link in the current directory.

So far so good.

But, what I don't understand is why the files and directories are moved to the parent of the argument?

The files appear inside /tmp instead of /tmp/someDirectory

Can anybody throw some light?

OS is Solaris.

Thanks

4
  • 1
    Don't have solaris at hand so cannot verify, but you create all structure at the destination, so in particular move content of the parent directory ../* to /tmp/someDirectory/../* which is /tmp/*.
    – jimmij
    Sep 22, 2018 at 3:28
  • Ah, so. When mv goes to the destination path; it's using the argument to recreate the directory structure. And, as the argument to recreate the structure has itself a ../* then it's being interpreted as: /tmp/someDirectory/../* which will point to /tmp because is using the .. link inside /tmp/someDirectory. Am I correct?
    – Aeross
    Sep 22, 2018 at 3:58
  • 1
    I'm not sure about that interpretation. Can you verify the expansion of the glob with something like echo .* /tmp/someDirectory?
    – Sparhawk
    Sep 22, 2018 at 4:18
  • I have access to the servers until monday haha... Posted the question here at home because it was bothering me all the way here.
    – Aeross
    Sep 22, 2018 at 4:35

1 Answer 1

3

Because basically the system is doing the following when using .*. renameat(AT_FDCWD, "../workingDirectory", AT_FDCWD, "/tmp/narf/../workingDirectory") Err#18 EXDEV Thus it's moved to /tmp/workingDirectory instead of /tmp/narf

2
  • To be precise, given that the target is /tmp, the mv command probably first attempts your posted renameat() system call, which likely fails with errno set to EXDEV since /tmp is almost certainly on a different file system. The mv command will then copy the file(s), and if successful delete the original(s). Sep 23, 2018 at 22:21
  • Obviously. Otherwise it wouldn't throw the EXDEV. But it shows the directory string with the ".."
    – c0t0d0s0
    Sep 24, 2018 at 2:47

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .