'Rm files *' remove todas as correspondências de todos os subdiretórios?


13

Quero remover qualquer arquivo parecido wordpress-891.sqlcom o diretório atual (não dentro dos subdiretórios).

Irá rm wordpress-*.sqlexecutar o truque ou também removerá correspondências dos subdiretórios?


1
Como um aparte, enquanto todas as outras respostas acabam corretas, há mais uma reviravolta: na verdade, é o bash, não o comando rm, que expande o curinga. Se você tiver dez arquivos correspondentes em seu diretório, o rm não verá o curinga, mas sim dez argumentos individuais. Se você deseja que a rm faça a expansão, coloque seu argumento entre aspas simples. Para a rm, não faz diferença, mas em alguns outros contextos pode. Normalmente, quando o curinga se refere a algo diferente de arquivos, como pacotes apt-get.
Kevin Keane #

3
@KevinKeane, rmnão faz a expansão do nome do arquivo ... rm "foo*"tentaria remover um arquivo com um asterisco literal no nome.
Ilkkachu

Respostas:


20

Não. O globbing normal *não é recursivo e nem é rm.

Se um nome de diretório corresponder, ele não será removido. Você precisará do -rsinalizador para excluir um diretório.

Portanto, é seguro fazer isso se tiver certeza de que deseja excluir esses arquivos.

Você também pode tornar rminterativo

rm -i wordpress-*.sql

então solicitará confirmação antes de excluir cada arquivo


14

Sim, ele faz o truque para você e remove todos os arquivos com esse esquema no diretório atual. E NÃO, ele não remove arquivos dentro dos subdiretórios.

Sempre que você não tiver certeza do que acontece quando você executa um comando como:

rm wordpress-*.sql

então execute-o usando ls:

ls wordpress-*.sql

os arquivos que você vê na saída são os que serão removidos.

Quando você está tentando obter uma lista como foo*:, é melhor usar -dswitch com lspara evitar listar arquivos dentro de um diretório chamado foobar/etc.

ls -d foo*

Este truque funciona para comandos que não são usados ​​para fazer o trabalho recursivamente.

A outra coisa que você pode fazer é digitar a entrada desejada, por exemplo: wordpress-*pressione Ctrl+ Alt+ *e agora todas as correspondências são digitadas automaticamente na frente do seu comando.


4
Meu método favorito:printf "%s\n" wordpress-*.sql
wjandrea 28/05

1
Você também pode fingir que gosta de eco echo rm file*. Especialmente olhar para nomes de arquivos hostis como-rf
Eckes

@eckes: você pode cobrir aqueles com mais segurança com rm ./*ou rm -- *.
David Foerster

Sim, ou use xargs -0@DavidFoerster
eckes

se você ir ls foo*e você tem um diretório chamado foobar, você também terá uma listagem do conteúdo deste diretório, tão simples lsnão é realmente a melhor maneira do que a rmvai bater
ilkkachu


-1

Se você deseja encontrar e excluir todos os arquivos correspondentes, como wordpress-*.sql, pode usar o findcomando :)

Por exemplo, você deseja remover todos os arquivos correspondentes com wordpress-*.sqlunder test_dir, faça o seguinte.

cd test_dir
find . -name "wordpress-*.sql" -exec rm -f {} \;

Sempre que o findprograma realmente encontra um arquivo correspondente, ele tenta executar um comando após a -execopção. Nesse caso rm -f {}, será executado e {}será alterado para o nome do arquivo correspondente. Por exemplo

rm -f wordpress-169.sql

Você também pode definir a profundidade dos subdiretórios com a -maxdepthopção

cd test_dir
find . -maxdepth 3 -name "wordpress-*.sql" -exec rm -f {} \;

Observe que você deve especificar a -maxdepthopção antes de outras opções. Caso contrário, você poderá encontrar os resultados do que realmente não deseja ver.


1
O OP quer o oposto: não recursar em subdiretórios.
Melebius

2
GNU find: "as opções afetam todos os testes, incluindo os testes especificados antes da opção", a lista de opções abaixo inclui -maxdepth. Use -exec rm -f {} +em vez de -exec \;, ou melhor ainda, apenas-delete
ilkkachu
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.