Exclui apenas arquivos, mas não pastas com rm

3

Eu tenho um diretório como este:

<folder1>
<folder2>
<folder3>
file1
file2
file3

Qual é o comando rm que remove apenas o arquivo1, o arquivo2, o arquivo3, mas deixa a pasta1, a pasta2 e a pasta3 e seu conteúdo intocado?

    
por Zurechtweiser 25.08.2015 / 11:24

2 respostas

6

rm não excluirá diretórios por padrão. Então, no seu exemplo, assumindo que você está no diretório pai e esses são todos os arquivos, tudo que você precisa é:

rm *

Esse é um comando perigoso. Se você esquecer onde está, um comando como esse pode acabar com arquivos $HOME importantes, apagar uma carga de fotos, cancelar o Natal, etc, etc, etc Verifique se você sabe o que * está selecionando antes de executá-lo. echo * é uma boa maneira de testar a expansão.

Uma pessoa sã apresentada com file1 file2 file3 pode executar rm file* ou rm file{1..3} para usar um pouco do código de expansão de Bash e não pegar os retardatários que você não tinha pensado no fogo cruzado.

Para excluir diretórios, você precisa especificar:

  • -d para excluir diretórios vazios ou
  • -r para excluir recursivamente os arquivos e seus diretórios.
por Oli 25.08.2015 / 11:30
2

Como o @Oli disse em sua resposta

  

rm não excluirá diretórios por padrão.

Mas você também pode usar find

find . -maxdepth 1 -type f -exec rm "{}" \;

ou com um padrão de pesquisa

find . -maxdepth 1 -type f -name "a*" -exec rm "{}" \;

Exemplo

% tree
.
├── a
├── b
├── bar
│   ├── a
│   └── b
└── foo
    ├── a
    └── b

%  find . -maxdepth 1 -type f -exec rm "{}" \;

% tree
.
├── bar
│   ├── a
│   └── b
└── foo
    ├── a
    └── b

ou com um padrão de pesquisa

% find . -maxdepth 1 -type f -name "a*" -exec rm "{}" \;

% tree                                                  
.
├── b
├── bar
│   ├── a
│   └── b
└── foo
    ├── a
    └── b
    
por A.B. 25.08.2015 / 11:28