opções alternativas para rm -f

10

Eu gostaria de executar uma linha de comando:

cd ~/www/tmp/; rm -P 2*

Mas recebo um erro se não houver arquivos começando com 2.

Você pensaria que eu gostaria de usar -f, no entanto:

-f      Attempt to remove the files without prompting for confirmation, regardless of the file's permissions.  If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error.

E eu faço o cuidado sobre o arquivo permissions- se há algo estranho acontecendo, eu prefiro o comando abortar. Eu só quero suprimir erros 'não existem'.

Examinei algumas outras perguntas com 'erros rm' e encontrei essas duas que parecem (um pouco) relevantes:

Exclua arquivos e diretórios por seus nomes. Não existe tal arquivo ou diretório

Mas não entendo tudo o que está acontecendo nas respostas a essa pergunta e não sei se preciso disso?

O touchhack sugerido nesta pergunta:

A rm não informou quando um arquivo está faltando?

Parece viável, pois acho que não me importo com o impacto no desempenho (mas que tipo de impacto você levaria? - ou seja: essa é uma técnica razoavelmente escalável ou estou apenas aprendendo hábitos muito ruins?)

Não tenho certeza de como eu faria if-thendentro da linha de comando.

Existem outras opções para uma limpeza simples da linha de comando cut-n-paste?

Funcionaria find -deletemelhor para o meu caso? Se sim, por quê?


erro em questão:

rm: 2*: No such file or directory
user3082
fonte
1
O erro é do seu shell, não rm, então você precisará dizer o que é isso.
Michael Homer
Você está usando zshcomo seu shell interativo? Você está recebendo um No matches founderro?
Kusalananda
2
@MichaelHomer Não, o erro é da rm. O shell simplesmente passou a string 2*para rm em vez de expandi-la para uma lista de arquivos. Olhe para o erro em questão: ele diz que rm está reclamando, não sh / bas / zsh / ...
doneal24

Respostas:

13

Para chamar única rm -Ppara existente arquivos regulares cujos nomes coincidem com um padrão em um diretório (mas não abaixo):

find directory -maxdepth 1 -type f -name 'pattern' -exec rm -P {} +

Por exemplo,

find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +

Para corresponder apenas aos não diretórios, use ! -type dno lugar de -type f. A diferença é que isso ! -type dseria verdade para uma ampla variedade de tipos de arquivos (links simbólicos, pipes nomeados, soquetes etc.)

Desde que você quer ser solicitado para algumas condições sobre os arquivos encontrados, você deve não usar -delete, em vez de -exec rmuma vez que funciona como rm -f.

Remova -maxdepth 1para permitir a findrecursividade nos subdiretórios.

Kusalananda
fonte
3
Embora ! -type dpossa estar mais perto rm 2*, eu acho?
Muru
Então, eu teria que adicionar -P para obter essa funcionalidade ?:find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +
user3082
@ user3082 Sim, esqueci que você também queria usar -P.
Kusalananda
Obrigado @muru, eu realmente quero -type f, mas não sabia como rmagir assim - então a sugestão de @ Kusalanada foi imediata, e a diferenciação / explicação é ótima para aprender.
user3082
@ user3082 você provavelmente teria que usar o globbing estendido do seu shell (por exemplo, rm 2*(.)no zsh).
Muru