Não é possível remover o arquivo usando 'rm'

4

Em um de nossos servidores (IBM AIX), temos um arquivo em path / data / 1002 / que não pudemos remover ou excluir usando o comando 'rm'. A mensagem de erro que recebemos é "rm: S1208001.002: Um arquivo ou diretório no nome do caminho não existe."

Com a opção "-f", nenhuma mensagem de erro foi exibida, mas o arquivo ainda está lá.

Este arquivo tem um tamanho de byte '0' e quando eu uso o comando "touch S120801.002", vejo dois arquivos com o mesmo nome de arquivo nesse diretório.

A listagem do diretório é a seguinte:

$ ls -l total 56
-rwxrwxrwx    1 oracle   dba               0 Feb 09 11:57 S1208001.002 
drwxrwxrwx    4 nobody   dba           24576 Feb 09 13:36 backup

Como faço para remover este falso fie?

Obrigado.

UPDATE 1

depois de usar o comando touch, a listagem do diretório é a seguinte:

$ ls -l total 56
-rwxrwxrwx    1 oracle   dba               0 Feb 09 11:57 S1208001.002 
-rwxrwxrwx    1 oracle   dba           77790 Feb 09 14:30 S1208001.002
drwxrwxrwx    4 nobody   dba           24576 Feb 09 13:36 backup
    
por Alvin Sim 09.02.2011 / 06:44

5 respostas

8

Parece que este nome de arquivo pode conter um caractere não imprimível. Isso explicaria "tocar" fazendo um arquivo diferente.

Tente algo como

       ls -b

no diretório para ver se é esse o caso?

Então você deve ser capaz de fazer algo como:

       rm -i S*2 

e ele deve solicitar o arquivo, mesmo com o caractere oculto.

Como alternativa, você pode usar o recurso para fazer isso ...

       find . -name S\*2 -exec /bin/rm -i {} \;

deve solicitar os arquivos ... Eu não sei se a sintaxe 'find' do AIX é incomum, então isso pode não funcionar, mas a parte 'rm -i' deve permitir que você aborte o comando se estiver errado. / p>     

por 09.02.2011 / 07:31
3

Você poderia tentar por inode. Não tenho certeza de qual caractere especial você está usando, mas vale a pena tentar:

$ touch badfile^M
$ ls -il bad*
   99 -rw-r--r--    1 username  group               0 Feb 09 04:39 badfile
$ find . -inum 99 -exec /bin/rm {} \;
$ ls -li bad*
ls: 0653-341 The file bad* does not exist.
    
por 09.02.2011 / 10:41
1

Há um espaço no final do arquivo (ou algum outro caractere não imprimível). Tente selecionar as duas linhas na sua saída $ ls -l para vê-lo. Para removê-lo, você pode tentar o método completamente seguro :

dir=/path/to/your/directory

absolute_dir_path_x="$(readlink -fn -- "$dir"; echo x)"
absolute_dir_path="${absolute_dir_path_x%x}"

while IFS= read -rd $'
dir=/path/to/your/directory

absolute_dir_path_x="$(readlink -fn -- "$dir"; echo x)"
absolute_dir_path="${absolute_dir_path_x%x}"

while IFS= read -rd $'%pre%' path
do
    file_path="$(readlink -fn -- "$path"; echo x)"
    file_path="${file_path%x}"
    echo "START${file_path}END"
done < <( find "$absolute_dir_path" -type f -name '*S1208001*' -print0 )
' path do file_path="$(readlink -fn -- "$path"; echo x)" file_path="${file_path%x}" echo "START${file_path}END" done < <( find "$absolute_dir_path" -type f -name '*S1208001*' -print0 )

Em seguida, você pode adicionar apenas um rm -- "${file_path}" no final do loop while.

    
por 09.02.2011 / 12:22
0

Possível que o sistema de arquivos mantenha o arquivo até que o último processo pare de usá-lo ou até que o fs seja limpo.

Eu vi algo semelhante em compartilhamentos NetApp montados pelo NFS. Apenas espere um pouco e o arquivo desaparecerá.

    
por 09.02.2011 / 08:39
0

Eu experimentei um problema semelhante e um simples fsck (e depois o rm novamente) resolveu meu problema

    
por 09.02.2011 / 11:32

Tags