Os diretórios são listados duas vezes

2

Eu tenho algo estranho. Eu cria alguns diretórios usando um script muito simples:

... cria todos os diretórios (executando sob um usuário que possui os direitos corretos) por exemplo:

mkdir -p /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre

Mas eu recebo os diretórios em dobro! Quando eu faço ls -lrt eu recebo

uxel081c: wmb - /home/EAI003A/05_EDSNFE/EAI2ISU/VEA # ls -lrt
total 0

drwxr-xr-x    2 wmb      mqbrkrs         256 Jan 28 15:25 tre
drwxr-xr-x    2 wmb      mqbrkrs         256 Jan 28 15:25 err
drwxr-xr-x    2 wmb      mqbrkrs         256 Jan 28 15:25 arc
drwxr-xr-x    2 wmb      mqbrkrs         256 Jun 12 08:35 tre
drwxr-xr-x    2 wmb      mqbrkrs         256 Jun 12 08:35 tbt
drwxr-xr-x    2 wmb      mqbrkrs         256 Jun 12 08:35 err
drwxr-xr-x    2 wmb      mqbrkrs         256 Jun 12 08:35 arc
drwxr-xr-x    2 wmb      mqbrkrs         256 Jun 13 10:49 tbt

(observe o duplo tre, tbt, arco ...)

Os diretórios duplos apontam para os mesmos dados.

Quando você faz um% normalls, recebe

uxel081c: wmb - /home/EAI003A/05_EDSNFE/EAI2ISU/VEA # ls
    tre  tre

Assim, apenas dois diretórios!

O que acontece?

    
por Laurens 17.06.2013 / 15:28

2 respostas

2

Se eu tivesse que arriscar um palpite, suspeitaria dos arquivos e se eles têm caracteres não imprimíveis em seus nomes. Você pode exibir esses caracteres especiais através do uso das seguintes opções para ls .

trecho de Removendo caracteres que não são impressos dos nomes dos arquivos

Locating "non-printing" characters in file names

The ls command has all the options you need to detect "hidden" characters:

Command      Function                                         Sample Output
-------      --------                                         ------ ------
ls           hides/interprets nongraphic characters           zzz
ls -b        prints octal codes for nongraphic characters     zzz000aaa
ls -q        prints question marks for nongraphic characters  zzz???aaa

Veja a página acima mencionada para mais informações sobre esses tipos de caracteres e removíveis.

    
por 17.06.2013 / 17:09
0

Meu palpite é que você editou seu script no Windows em algum momento, e essa versão tinha finais de linha do Windows : um CR (retorno de carro) seguido por um LF (avanço de linha). Até onde os shells Unix são convertidos, LF é o caractere final de linha, e CR é um caractere comum. Então, se você tem isso no seu script (onde ␍ é um caractere CR):

mkdir -p /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre␍

depois, no seu editor, você só verá

mkdir -p /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre

mas o shell vê que o comando mkdir é chamado com os argumentos -p e /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre␍ .

Quando o caractere CR é impresso em um terminal, seu efeito é mover o cursor para o início da linha. Com ls -l , o CR só aparece no final da linha e, portanto, não tem efeito visível. Com ls simples, o CR no final de cada segundo nome de arquivo faz com que o próximo par de nomes de arquivos sobrescreva as linhas anteriores.

Converta seu script para usar finais de linha do Unix com um destes comandos:

dos2unix /path/to/script                # if dos2unix is available
sed -i -e $'s/\r//' /path/to/script     # on Linux or Cygwin only
perl -i -e 's/\r$//' /path/to/script

Seu editor pode ter uma maneira de fazer isso também. Em seu editor, quando você editar um script de shell, verifique se as terminações de linha são "LF" ou "Unix" ou "Linux" e não "CRLF" ou "Windows" ou "DOS".

Dependendo da sua variante unix, tente ls -b ou ls -Q ou ls -q para exibir o caractere especial no nome do arquivo. Para mesclar os dois diretórios, primeiro mova os arquivos para o diretório correto e remova o outro.

mv -i tre/* tre?/
rmdir tre?/
    
por 17.06.2013 / 20:06