Shell Commands – Understanding the Slash (/) After a Directory Name

directoryfilenamesrenameslash

I have a little question here.

If I have two files, say filea and fileb, mv filea fileb would

  • delete fileb
  • rename filea to fileb

Then if I have two directories, say dira and dirb, mv dira dirb would

  • move dira into dirb (it will become dirb/dira)

Noting that in both cases there are no notice or message, then this is pretty inconsistent to me. I think mv dira dirb should just overwrite dirb with the contents of dira (or merge the two directories under a directory named dirb).

I remember reading somewhere that a directory name with a slash (like dira/) is treated like a directory, and name with no slash (like dira) is treated like a file (to certain extents, of course). Anyway now I want to make the shell (zsh and possibly bash) respect my notation of a directory by using a slash. Is there a terminal option which enable me to enforce that?

To clarify, here is my desired behaviour:

  • mv dira dirb results in dirb being overwritten with the contents of dira
  • mv dira dirb/ results in dira being moved into dirb (in dirb/dira)

Has anyone thought the same way as me? Or am I just weird?

Best Answer

Yes, this is a bit inconsistent, even within the GNU tools.

One problem with your proposal is that non-empty directories cannot be removed. Apart from that, -T (in GNU land, anyway) approximates what you want (the first case):

$ ls dira/ dirb/
dira/:
a

dirb/:
b
$ mv -iT dira/ dirb/
mv: overwrite `dirb/'? y
mv: cannot move `dira/' to `dirb/': Directory not empty
$ rm dirb/b 
$ mv -iT dira/ dirb/
mv: overwrite `dirb/'? y
$ ls dira/ dirb/
ls: cannot access dira/: No such file or directory
dirb/:
a
Related Question