O que há de errado com este comando "encontrar todos os arquivos de troca do vim e removê-los com uma confirmação"?

O que há de errado com este comando "encontrar todos os arquivos de troca do vim e removê-los com uma confirmação"?

Estou tentando remover todos os arquivos de troca do vim *.swpe removê-los com uma confirmação. O findcomando encontrou os arquivos, mas rmdiz No such file or directorycom a -iopção. Quando codifico o caminho do arquivo e apenas uso 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 -execopção. Alguma sugestão? Desde já, obrigado!

Responder1

O erro é gerado porencontrar, nãorm.

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

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

então find obtém vários argumentos após "-exec" e trata o primeiro como comando e os outros como argumentos de comando.

Responder2

RESPOSTA ATUALIZADA:

se você estiver usando a versão bash> 4.0, poderá 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 shopt -s globstarparte ativará a **correspondência recursiva no bash. Você pode colocar isso no seu .bashrce ser feliz para todo o sempre.

RESPOSTA ANTIGA:

Geralmente acho mais fácil usar ferramentas simples combinadas

cd para dir e então:

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

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

Aviso: Use isto somente se seus nomes de arquivos não contiverem espaços.

Responder3

No seu caso, eu correria,

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

O arquivo de troca do VIM não termina apenas em .swp. Se .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 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 \in .\*.sw?o torna compatível em múltiplas plataformas.

informação relacionada