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:
$ rm -f abc.log.* # Remove them all
$ rm -f abc.log.2012* # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]* # Remove all files from the first quarter of 2012
As expressões regulares são mais poderosas do que os curingas; você pode alimentar a saída de grep
para rm -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:
$ rm -f $(ls | grep -i '^abc\.log\.')
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 usando rm -f
:
$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)
onde se !!
expande para o comando anterior. Ou posso digitar seta para cima ou Ctrl-P e editar a linha anterior para adicionar o rm -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:
$ rm -f `ls | grep -i '^abc\.log\.'`
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:
$ ls > list
$ vi list # Use your favorite text editor
Posso então editar o list
arquivo manualmente, deixando apenas os arquivos que desejo remover e, em seguida:
$ rm -f $(<list)
ou
$ rm -f `cat list`
(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 adicionar rm -f
no início de cada linha e então:
$ . ./list
ou
$ source ./list
Editar o arquivo também é uma oportunidade para adicionar cotações quando necessário, por exemplo, mudar rm -f foo bar
para rm -f 'foo bar'
.