Eu queria excluir um pacote do meu arquivo inicial, mas o nome do arquivo era muito longo ( google-chrome-stable_current_i386.deb
). Então, decidi usar o comando ls|grep chrome|rm
para canalizar os arquivos para grep, filtrar o arquivo chrome e removê-lo. Não funcionou, então eu gostaria de ver como posso fazer isso.
33
rm -i *chrome*.deb
ls
find
-find . -name "*chrome*" -delete
.ls
atravésgrep
derm
, mas não conseguiu fazê-lo funcionar. Dessa forma, você obterá uma ou duas boas respostas sobre a maneira "correta" ou "mais fácil" de realizar sua tarefa, em vez de forçar alguém a lhe dar uma boa resposta sobre uma solução ineficiente.Respostas:
Isso quase me fez estremecer.
ls
será mais complicado e propenso a erros do que métodos estabelecidos comofind [...] -exec
ou globs .rm google
e pressionar Tab. Se não for concluído imediatamente, pressione Tabnovamente para ver uma lista dos arquivos correspondentes. Digite mais caracteres do nome do arquivo para reduzi-lo até que seja concluído e execute o comando.fonte
rm
- é provavelmente a maneira mais comum de fritar sua distribuição.Você também pode usar o comando find com um curinga:
Observe que o argumento "-maxdepth" garante que a localização funcione apenas no diretório atual e não se repita em subdiretórios.
fonte
-iname
para nomes de arquivos que não diferenciam maiúsculas de minúsculas (b) canalize oxargs
uso de-print0
sinalizador parafind
e-0
sinalizador paraxargs
. O uso dexargs
permite que você faça coisas comofoo
exclusões "interativas" (confirmar exclusão ?).find . -name '*chrome*' -exec rm -i {} +
maxdepth
a ser 1.Você teve a ideia certa, apenas perdeu alguns detalhes. Como você está lidando com uma lista que chega ao STDIN e
rm
espera parâmetros, você precisa usá-loxargs
.Portanto:
Deve dar o que você quer.
Observe que, se você deseja excluir tudo que não seja o
chrome
arquivo, pode simplesmente adicionar-v
àgrep
instrução.Observe que, de acordo com as outras respostas a essa pergunta, essa provavelmente é uma maneira ruim de realizar o que você deseja realizar.
fonte
-v
, isso não excluiria tudo, exceto os arquivos correspondenteschrome
? Eu não acho que é isso que o OP quer ...ls
saída. Nomes de arquivos com espaços irão destruir isso. Isso também é perigoso se alguém puder construir um nome de arquivo com molho especial no diretório em que você executa isso. Como mais de uma pessoa já apontou, não analise a saída de ls !Nunca analise a saída de ls
Minha sugestão é evitar analisar a saída de ls [ 1 ] , ainda mais se estiver em conjunto com o
del
comando. Isso por muitos motivos, principalmente relacionados a caracteres inesperados e não usuais permitidos no nome do arquivo.Mesmo quando você espera que os nomes de arquivos pertencentes aos pacotes Linux "se comportem bem" , esse problema pode aparecer se outros arquivos estiverem presentes no mesmo diretório, mas você não sabia ou notou.
É melhor usar
find
, a expansão da guia (comece a escrever o nome e pressione Tab), a expansão do nome do arquivo [ 2 ] como*MyKey*
...Uma solução rápida
Como você deseja selecionar todos os pacotes (que terminam com
.deb
) com "google" dentro, você pode criar sua solicitação com o curinga*
*google*.deb
e fazer um simplesque selecionará cada nome de arquivo com "google" no meio que terminará no
.deb
presente no diretório atual. A opção-i
(interativa) solicitará a confirmação, um bom hábito ao excluir arquivos com a expansão de parâmetro.Uma solução próxima à filosofia de sua tentativa
Se seu objetivo é criar sua linha de comando peça após peça, você fez isso
ls
depoisls | grep google
e somente depois de verificar sua saída, é possível executá-la em uma subshell$(...)
comUma maneira mais rápida e perigosa [ 3 ] , é usar
!!
que executará o último comando concluído em seu histórico . Você pode proteger-se do fato de que você não tem controle visual da linha que você está indo para executar se você tiver ativado previamente as opções do shell
histverify
comshopt -s histverify
.fonte
... use
-name '*c*.deb'
ou algum outro padrão que combina com você.fonte
rm
não aceita entrada destdin
. Você precisará fazer algo comols google-chrome* | xargs rm
fonte