ls shows a directory but it is inaccessible

I was trying to copy one folder from one location to another. The folder is about 6.4 Gb.

So I did

cp -r source_folder level1/val

after that, I went into the level1 folder and checked:

level1$ ls

But If I try to cd into val, an error is raised:

level1$ cd val
-bash: cd: val: No such file or directory

And it does not appear to be copying anything, either:

level1$ du -sh val
0   val

I also checked with python if the directory exists or not, but it also says that it does not exist

>>> import os
>>> os.path.exists('level1/val')

I can’t even delete the folder that has been created:

level1$ rmdir val
rmdir: failed to remove 'val': Not a directory

On the other hand, I was able to delete it as if it was a file:

level1$ rm val
level1$ ls

What is going on? And how can I make sure to copy the folder correctly?

Added the output of ls -ld source_folder level1/val which returns

lrwxrwxrwx 1 user1 dinfk      4 Jun 20 12:05 source_folder -> test
drwxr-sr-x 2 user2  systems 4096 Aug 27 19:02 level1/val
Asked By: Ant


source_folder – is symlink that refer to the test directory

But you directory path in symlink is relative. If you use absolute path (e.g. /home/user/test) in symlink copying will happen normally.

If you want to copy all files from the directory to which the symbolic link points, you could use -d option with cp command.

Answered By: Egor Vasilyev

Evidently, the val that resulted from the copy the first time round is a broken symbolic link.

  • ls lists val because it exists: there is a directory entry called val.
  • cd val complains “No such file or directory” because val is a broken symbolic link. cd needs to access the target of the link, but the target doesn’t exist (that’s the definition of a broken symlink).
  • du val shows 0 because a symbolic link doesn’t use any storage space. (The space for the name and metadata is not counted.)
  • os.path.exists returns False for broken symbolic links.
  • rmdir val rightfully complains that val is not a directory, since it’s a symbolic link.
  • rm val deletes val normally, since val is a file that isn’t a directory.

You report:

lrwxrwxrwx 1 user1 dinfk      4 Jun 20 12:05 source_folder -> test

The command cp -r copies the symbolic link as a symbolic link. Since source_folder is a symbolic link whose target is test, this results in level1/val being a symbolic link whose target is test. The target of a symbolic link is a simple string, it doesn’t “track” anything. Symbolic links that don’t start with a / are relative. level1/val is a symbolic link whose target is test so it points to level1/test. Since level1/test doesn’t exist, the symbolic link is broken.

Later you saw:

drwxr-sr-x 2 user2  systems 4096 Aug 27 19:02 level1/val

This time you did something different and copied a directory tree.

To copy the target of the link rather than the link itself, you can use

cp -r source_folder/ level1/val

The trailing slash tells the cp command to act on the directory that the link points to rather than on the symbolic link itself. If the argument is a directory, this doesn’t make any difference.

In case someone also appears to have this particular problem where the proposed solution does not work: Make sure that you really spelled the directory name correctly and pay special attention to special (non-ASCII) characters in its name.

In my case I had the following situation:

$ ll
total 68
-rw-r--r-- 1 st_ac131646 st_us-031110 1387 29. Jun 10:02
-rw-r--r-- 1 st_ac131646 st_us-031110 1387 29. Jun 10:03
drwxr-xr-x 2 st_ac131646 st_us-031110 4096 29. Jun 09:17 rḱs
drwxr-xr-x 2 st_ac131646 st_us-031110 4096 29. Jun 13:20 tests

But when I tried e.g. cd rks or rmdir rks, the system would always tell me that no such file or directory existed. I could even do a mkdir rks and now all of a sudden there appeared a second directory with this name in the ls output (which was accessible as one would expect).

In any case, when you look closer, I must have accidentally created the first directory with a instead of a regular k which is why when typing the name as rks (instead of rḱs) the system obviously told me that this does not exist.

So long story short: Double-check your spelling and potentially try copy-pasting the name from the ls output.

Answered By: Raven
Categories: Answers Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.