ls mostra um diretório, mas é inacessível

1

Eu estava tentando copiar uma pasta de um local para outro. A pasta é de cerca de 6,4 GB.

Então eu fiz

cp -r source_folder level1/val

depois disso, eu entrei na pasta level1 e verifiquei:

level1$ ls
val

Mas se eu tentar cd em val, um erro é levantado:

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

E não parece estar copiando nada:

level1$ du -sh val
0   val

Também verifiquei com python se o diretório existe ou não, mas também diz que ele não existe

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

Eu não consigo nem excluir a pasta que foi criada:

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

Por outro lado, consegui eliminá-lo como se fosse um arquivo:

level1$ rm val
level1$ ls
level1$ 

O que está acontecendo? E como posso ter certeza de copiar a pasta corretamente?

EDITAR Adicionada a saída de ls -ld source_folder level1/val , que retorna

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
    
por Ant 27.08.2017 / 18:43

2 respostas

2

Evidentemente, o val resultante da cópia na primeira vez é um link simbólico quebrado . .

  • ls lists val porque existe: existe uma entrada de diretório chamada val .
  • cd val reclama “Nenhum tal arquivo ou diretório” porque val é um link simbólico quebrado. cd precisa acessar o destino do link, mas o alvo não existe (essa é a definição de um link simbólico quebrado).
  • du val mostra 0 porque um link simbólico não usa nenhum espaço de armazenamento. (O espaço para o nome e metadados não é contado.)
  • os.path.exists retorna False para links simbólicos quebrados.
  • rmdir val reclama com razão que val não é um diretório, já que é um link simbólico.
  • rm val exclui val normalmente, pois val é um arquivo que não é um diretório.

Você denuncia:

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

O comando cp -r copia o link simbólico como um link simbólico. Como source_folder é um link simbólico cujo destino é test , isso resulta em level1/val sendo um link simbólico cujo destino é test . O alvo de um link simbólico é uma string simples, não “rastreia” nada. Links simbólicos que não iniciam com / são relativos. level1/val é um link simbólico cujo destino é test , portanto, aponta para level1/test . Como level1/test não existe, o link simbólico está quebrado.

Mais tarde você viu:

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

Desta vez, você fez algo diferente e copiou uma árvore de diretórios.

Para copiar o alvo do link em vez do próprio link, você pode usar

cp -r source_folder/ level1/val

A barra à direita diz ao comando cp para atuar no diretório para o qual o link aponta, em vez de no próprio link simbólico. Se o argumento é um diretório, isso não faz diferença.

    
por 29.08.2017 / 02:24
3

source_folder - é um link simbólico que se refere ao diretório test

Mas o caminho do diretório no symlink é relativo. Se você usar o caminho absoluto (por exemplo, /home/user/test ) no symlink, a cópia será feita normalmente.

Se você quiser copiar todos os arquivos do diretório para o qual o link simbólico aponta, você pode usar a opção -d com o comando cp .

    
por 27.08.2017 / 21:53