O que há de errado com esse comando “localizar todos os arquivos de troca vim e removê-los com uma confirmação”?

3

Estou tentando remover todo o arquivo de permuta vim *.swp e removê-los com uma confirmação. O comando find encontrou os arquivos, mas rm diz No such file or directory com a opção -i . Quando codifico o caminho do arquivo e uso apenas rm -i , parece funcionar.

Veja abaixo

(doors)hobbes3@hobbes3 ~/Sites $ find mysite mysite_BAK -name *.swp -exec 'rm -i {}' \;
find: rm -i mysite/templates/.base.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.create.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.detail.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.list.html.swp: No such file or directory
(doors)hobbes3@hobbes3 ~/Sites $ rm -i mysite/templates/.base.html.swp 
remove mysite/templates/.base.html.swp? n

Acho que estou fazendo algo errado com a opção -exec . Alguma sugestão? Obrigado antecipadamente!

    
por hobbes3 25.03.2012 / 09:28

3 respostas

8

O erro é gerado por find , não rm .

A razão é que você escreveu assim 'rm -i <file>' é o único argumento. Isso deve ser reescrito:

find mysite mysite_BAK -name '*.swp' -exec rm -i '{}' \;

então find recebe vários argumentos depois de "-exec" e trata o primeiro como um comando e outros como os argumentos do comando.

    
por 25.03.2012 / 09:45
8

RESPOSTA ATUALIZADA:

se você estiver usando a versão bash > 4.0, você pode usar o recurso globstar, é muito fácil:

shopt -s globstar
rm -i **/*.swp

Isso também funciona com nomes de arquivos que contêm espaços!

A parte shopt -s globstar ativará a correspondência ** recursiva no bash. Você pode colocar isso no seu .bashrc e ser feliz para sempre e sempre.

OLD ANSWER:

Geralmente, acho mais fácil usar ferramentas simples combinadas

cd para dir e, em seguida:

rm -i 'find . | grep .swp$'

é mais fácil de lembrar (se o desempenho não é um problema)!

Aviso: use-o somente se os nomes dos seus arquivos não contiverem espaços.

    
por 01.10.2013 / 22:32
1

No seu caso, eu corria,

find mysite mysite_BAK -type f -name .\*.sw? -exec rm -i {} ";"

O arquivo de troca do VIM não termina apenas no .swp. Se o .swp existir, o VIM criaria .swo, depois .swn e assim por diante. Além disso, os arquivos de troca são prefixados com um ponto (.), Por exemplo, .file1.rb.swp

Outras maneiras de localizar e excluir os arquivos de troca do VIM, sem a confirmação (-i):

find some_dir -type f -name .\*.sw? | xargs rm 
find some_dir -type f -name .\*.sw? -exec rm {} ";"
find some_dir -type f -name .\*.sw? -delete  # -delete option does not work in Git Bash

Sem "-type f", você receberia um erro ao excluir um diretório. Além disso, o \ em .\*.sw? torna-o compatível em várias plataformas.

    
por 20.05.2014 / 16:41

Tags