Dois arquivos na mesma pasta com o mesmo nome - precisa excluir um, mas não ambos

4

Parece que temos dois arquivos na pasta /var/spool/lp/logs chamada "pedidos". Um é de propriedade de lp, o outro de raiz.

Precisamos remover o arquivo de solicitações de propriedade do root - como o referenciamos?

Aqui está a saída do comando ls -l :

-rw-r--r--   1 root     sys            0 Jan 30  2014 lp                 
-rw-rw----   1 root     lp          6584 Nov  4 06:10 lpsched            
-rw-rw----   1 lp       lp          3365 Dec 14 10:56 requests           
-rw-r--r--   1 root     sys      1668416 Dec 14 10:41 requests           
drwxr-xr-x   2 root     sys         1024 Sep 30  2013 requests.archives  
    
por Magie Duddy 14.12.2016 / 20:00

2 respostas

10

Se você tiver o GNU ls, você pode executar ls -lQ para ver uma versão com aspas do nome do arquivo:

$ ls -lQ
total 0
-rw-r--r--. 1 user group 0 Dec 14 14:32 "requests"
-rw-r--r--. 1 user group 0 Dec 14 14:32 "requests "

Para remover um arquivo específico, primeiro encontre seu número de inode com ls -li :

$ touch 'requests' 'requests '
$ ls -li
total 0
440 -rw-r--r--. 1 user group 0 Dec 14 14:32 requests
441 -rw-r--r--. 1 user group 0 Dec 14 14:32 requests

Aqui temos dois arquivos similares, um com o inode 440, o outro com o 441 (coluna da esquerda).

Para o seu caso, encontre o arquivo de propriedade do root e pegue o número do inode. A opção -xdev (ou -mount ) para find diz para permanecer no mesmo sistema de arquivos, caso você tenha um sistema de arquivos montado sob o diretório atual, para evitar a captura de arquivos correspondentes naquele sistema de arquivos filho.

Então:

$ find . -inum 441 -xdev -user root -ls
441    0 -rw-r--r--   1 user group 0 Dec 14 14:32 ./requests\

Observe que find citou o caractere de espaço no final.

e para excluir:

$ find . -inum 441 -xdev -user root -delete  # GNU find

ou

$ find . -inum 441 -xdev -user root -exec rm {} \;  # otherwise
    
por 14.12.2016 / 20:46
6

Você não pode ter dois arquivos com o mesmo nome na mesma pasta. É provável que alguém tenha um personagem invisível (como um espaço à direita).

Minha sugestão seria renomear requests para requests.real e depois executar uma exclusão interativa. Você pode escolher excluir o que não deseja e, em seguida, (se necessário) renomear o outro usando um curinga para o nome correto

mv requests requests.real             # STOP if this fails
mv requests.archives KEEP.archives    # Temporary
rm -i req*                            # Interactive delete: "y" to delete, "n" to skip
mv req* requests                      # Rename whatever's left that begins "req"
mv KEEP.archives requests.archives    # Put this one back again
    
por 14.12.2016 / 20:05

Tags