Como eu canso ls para grep e excluo os arquivos filtrados por grep?

23

Eu queria excluir algum pacote no 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 enviar os arquivos para grep para filtrar o arquivo chrome e depois removê-lo. Não funcionou, então gostaria de ver como posso fazer isso.

    
por SpecialBomb 07.12.2015 / 15:44

6 respostas

51

Isso quase me fez estremecer.

  1. Você pode querer parar de apontar a espingarda no seu pé. Basicamente, qualquer tipo de análise de ls será mais complicado e propenso a erros do que métodos estabelecidos como find [...] -exec ou globs .
  2. A menos que alguém tenha instalado uma distro de trolls para você, seu shell terá a conclusão de Tab . Apenas digite rm google e pressione Tab . Se não completar imediatamente, pressione Tab novamente para ver uma lista dos arquivos correspondentes. Digite mais caracteres do nome do arquivo para reduzi-lo até que seja concluído e, em seguida, execute o comando.
  3. Pipes ! = parameters . A entrada padrão é um fluxo de dados binários que pode ser alimentado para um comando de forma assíncrona. Parâmetros são strings separadas por espaços que são passadas uma vez e somente uma vez para um comando ao executá-lo. Estes são muito raramente intercambiáveis.
por 07.12.2015 / 19:51
30

Você também pode usar o comando find com um curinga:

find . -maxdepth 1 -name '*chrome*' -delete

Observe que o argumento "-maxdepth" garante que o find funcione apenas no diretório atual e não recaia em subdiretórios.

    
por 07.12.2015 / 15:59
25

Você teve a ideia certa, apenas perdeu alguns detalhes. Como você está lidando com uma lista chegando a STDIN e rm espera parâmetros, você precisa usar xargs .

Assim:

ls | grep chrome | xargs rm

Deve dar o que você quer.

Observe que, se quiser excluir tudo que não seja o arquivo chrome , basta adicionar -v à instrução grep .

Observe que, de acordo com as outras respostas a essa pergunta, essa provavelmente é uma maneira ruim de realizar o que você deseja realizar.

    
por 07.12.2015 / 15:50
10

Nunca analise a saída de ls
Minha sugestão é evitar analisar a saída de ls [ 1 ] , ainda mais se em conjunto com o comando del . Isso por vários motivos, principalmente relacionados a caracteres inesperados e não usuais permitidos no nome do arquivo.

Mesmo quando você deve esperar que os nomes de arquivos pertencentes a pacotes Linux "se comportem bem" , este problema pode aparecer se outros arquivos estiverem presentes no mesmo diretório, mas você não conhece ou percebe .

É 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 simples

rm -i *google*.deb 

que selecionará cada nome do arquivo com "google" no meio que terminará em .deb presente no diretório atual. A opção -i (interativa) solicitará a confirmação, um bom hábito quando você apaga arquivos com a expansão de parâmetros.

Uma solução próxima da filosofia da sua tentativa
Se o seu propósito é construir a sua linha de comando peça após peça, então você terá feito ls , depois ls | grep google , e somente depois de ter verificado sua saída você pode executá-la em uma subshell $(...)

rm -i $(ls | grep google)

Uma maneira mais rápida e mais perigosa [ 3 ] , é usar !!

ls | grep google
rm -i $(!!)

que executará o último comando concluído em seu histórico . Você pode se proteger do fato de não ter controle visual da linha que será executada se tiver ativado antecipadamente as opções de shell histverify with shopt -s histverify .

    
por 08.12.2015 / 09:39
5
touch 0 1 2 3 4 5 6 7 8 9
find . -name \[0-9] -ok rm {} \;
< rm ... ./0 > ? y
< rm ... ./9 > ? y
< rm ... ./8 > ? y
< rm ... ./7 > ? y
< rm ... ./6 > ? y
< rm ... ./5 > ? y
< rm ... ./4 > ? y
< rm ... ./3 > ? y
< rm ... ./2 > ? y
< rm ... ./1 > ? y
^C

... use -name '*c*.deb' ou algum outro padrão que seja adequado para você.

    
por 07.12.2015 / 16:02
1

rm não aceita entrada de stdin . Você precisará fazer algo como ls google-chrome* | xargs rm

    
por 07.12.2015 / 15:47

Tags