'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?

HorusCoding
fonte
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

Zanna
fonte
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.

Ravexina
fonte
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
12

Não, rmnão recursa através de subdiretórios.

Consulte Excluir arquivos correspondentes em todos os subdiretórios - SuperUser para obter métodos para excluir arquivos nos subdiretórios.

Se você estiver preocupado em excluir acidentalmente algo importante, use gvfs-trash(que envia arquivos para a lixeira) em vez de rm(que exclui arquivos permanentemente).

wjandrea
fonte
Obrigado pela gvfs-trashmenção aprendi alguma coisa hoje quase não usá-lo ...
George Udosen
-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.

Parque Sung-Jin
fonte
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