Tenho esta lista de arquivos em um servidor Linux:
abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10
Estou excluindo arquivos de log selecionados um por um, usando o comando rm -rf
abaixo:
rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28
Existe outra maneira de excluir os arquivos selecionados de uma vez?
GNU
é necessário?Respostas:
O Bash suporta todos os tipos de curingas e expansões.
Seu caso exato seria tratado pela expansão da chave , assim:
O código acima se expandiria para um único comando com todos os três argumentos e seria equivalente a digitar:
É importante notar que essa expansão é feita pelo shell, antes
rm
mesmo de ser carregada.fonte
Use um curinga (
*
) para corresponder a vários arquivos.Por exemplo, o comando abaixo excluirá todos os arquivos com nomes que começam com
abc.log.2012-03-
.Eu recomendo correr
ls abc.log.2012-03-*
para listar os arquivos para que você possa ver o que vai deletar antes de executar orm
comando.Para obter mais detalhes, consulte a página de manual do Bash sobre expansão de nome de arquivo .
fonte
Se você deseja excluir todos os arquivos cujos nomes correspondem a um determinado formulário, um curinga (padrão glob) é a solução mais direta. Alguns exemplos:
As expressões regulares são mais poderosas do que os curingas; você pode alimentar a saída de
grep
pararm -f
. Por exemplo, se alguns dos nomes de arquivo começam com"abc.log"
e alguns com"ABC.log"
,grep
permite fazer uma correspondência sem distinção entre maiúsculas e minúsculas:Isso causará problemas se algum dos nomes de arquivo contiver caracteres engraçados, incluindo espaços. Seja cuidadoso.
Quando faço isso, executo o
ls | grep ...
comando primeiro e verifico se ele produz a saída que desejo - especialmente se estiver usandorm -f
:onde se
!!
expande para o comando anterior. Ou posso digitar seta para cima ou Ctrl-P e editar a linha anterior para adicionar orm -f
comando.Isso pressupõe que você está usando o shell bash. Alguns outros shells, particularmente csh e tcsh e alguns shells derivados de sh mais antigos, podem não suportar a
$(...)
sintaxe. Você pode usar a sintaxe de crase equivalente:A
$(...)
sintaxe é mais fácil de ler e, se você for realmente ambicioso, pode ser aninhada.Finalmente, se o subconjunto de arquivos que você deseja excluir não pode ser facilmente expresso com uma expressão regular, um truque que costumo usar é listar os arquivos em um arquivo de texto temporário e, em seguida, editá-lo:
Posso então editar o
list
arquivo manualmente, deixando apenas os arquivos que desejo remover e, em seguida:ou
(Novamente, isso pressupõe que nenhum dos nomes de arquivo contém caracteres engraçados, especialmente espaços.)
Ou, ao editar o
list
arquivo, posso adicionarrm -f
no início de cada linha e então:ou
Editar o arquivo também é uma oportunidade para adicionar cotações quando necessário, por exemplo, mudar
rm -f foo bar
pararm -f 'foo bar'
.fonte
Basta usar a seleção multilinha no sublime para combinar todos os arquivos em uma única linha e adicionar um espaço entre cada nome de arquivo e adicionar
rm
no início da lista. Isso é útil principalmente quando não há um padrão nos nomes de arquivo que você deseja excluir.fonte
Um curinga funcionaria bem para isso, embora, para ser seguro, seria melhor fazer o uso do curinga o mínimo possível, então algo mais ou menos assim:
Embora, ao que parece, esses sejam apenas arquivos individuais? A opção recursiva não deve ser necessária se nenhum desses itens forem diretórios, então é melhor não usá-la, apenas por segurança.
fonte
Não sou um guru do Linux, mas acredito que você queira canalizar sua lista de arquivos de saída para
xargs rm -rf
. Eu usei algo assim no passado com bons resultados. Teste primeiro em um diretório de amostra!EDITAR - Posso ter entendido mal, com base nas outras respostas que estão aparecendo. Se você pode usar curingas, ótimo. Presumi que a lista original que você exibiu foi gerada por um programa para dar a você sua "seleção", então pensei que piping para
xargs
seria o caminho a percorrer.fonte
se você deseja excluir todos os arquivos que pertencem a um diretório de uma vez. Por exemplo: o nome do seu diretório é "log" e o diretório "log" inclui os arquivos abc.log.2012-03-14, abc.log.2012-03-15, ... etc. Você deve estar acima do diretório de log e:
fonte