Comando para excluir arquivos temporários terminados em ~

15

Muitos dias atrás, eu encontrei este alias bash útil (conteúdo do meu ~ / .bash_aliases )

# aliases

# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'

Agora tentei usar rm~ após cd em algum diretório contendo 3 arquivos que terminam em ~

Eu recebi este erro no terminal e os arquivos não foram excluídos

find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Além disso, quando eu tentei rm~ de /home/me , parece não estar fazendo nada. Ou pode levar muito tempo.

Por favor, diga-me por que estou recebendo erros e como corrigi-los.

Obrigado!

    
por Vinayak Garg 28.12.2012 / 09:46

2 respostas

26

Seu bash alias não está bem escrito (as aspas simples não são bem usadas). Em vez disso, deve ser:

alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'

Agora, eu pessoalmente não gosto de usos inúteis de pipes e xargs , então seu alias seria melhor escrito como:

alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'

A opção -type f para encontrar apenas arquivos (não diretórios, links, etc.), a opção -v para rm para ser detalhada (imprime o que está excluindo). O + no final, para que find execute rm com todos os arquivos encontrados (gera apenas uma instância de rm , em vez de um por arquivo).

Agora de man bash :

  

Para quase todos os propósitos, os aliases são substituídos pelas funções do shell.

Em vez de um alias, é melhor usar uma função: comentar seu alias no arquivo .bash_aliases (ou seja, colocar um # na frente dessa linha) e, no arquivo .bashrc , colocar isso < em> function (em qualquer lugar no arquivo, no final é bom):

rm~() {
    find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}

Além disso, como a outra resposta menciona, você pode usar o comando -delete para localizar. Nesse caso, sua função rm~ será:

rm~() {
    find . -name "*~" -type f -printf "Removing file %p\n" -delete
}

Na verdade, você pode criar uma função legal que levará um argumento, digamos, --dry-run , que só exibirá o que será excluído:

rm~() {
    case "" in
    "--dry-run")
        find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
        ;;
    "")
        find . -name "*~" -type f -printf "Removing file %p\n" -delete
        ;;
    *)
        echo "Unsupported option \''. Did you mean --dry-run?"
        ;;
    esac
}

Em seguida, use como:

rm~ --dry-run

para mostrar apenas os arquivos que serão excluídos (mas não apagá-los) e, em seguida,

rm~

quando você está feliz com isso.

Adapte-se e estenda-se às suas necessidades!

Observação. Você terá que abrir um novo terminal para que as alterações entrem em vigor.

    
por gniourf_gniourf 28.12.2012 / 11:01
9

*~ é expandido pelo shell antes de ser atribuído ao seu alias. A atribuição real é:

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

Eu sugiro usar funções em vez de aliases, eles são muito mais poderosos e fáceis de lidar com citações.

Enquanto estivermos nisso, remova o . supérfluo (o diretório atual está implícito se nenhum parâmetro for fornecido) e pare de abusar de xargs , pois a opção -delete já existe.

rm~() { find -name '*~' -ls -delete; }

A opção -ls é opcional, mas a adição mostrará quais arquivos foram excluídos.

    
por Lekensteyn 28.12.2012 / 09:54

Tags