Como posso excluir todos os arquivos com uma extensão específica em uma pasta específica?

36

Se eu definir o diretório atual / ativo (navegando até ele usando cd) para algum diretório específico e digite:

rm *.xvg

O que esse comando fará? É verdade que o comando acima excluirá apenas arquivos com a extensão .xvg somente no diretório de trabalho?

Eu estava nervoso por tentar isso antes de perguntar, porque quero ter certeza absoluta de que o comando acima excluirá apenas .xvgarquivos LOCALIZADOS NO DIRETÓRIO DE TRABALHO .

Andrew
fonte

Respostas:

34

Sim, rm *.xvgserá única excluir os arquivos com a extensão especificada em sua atual diretório.

Uma boa maneira de garantir que você esteja realmente no diretório que deseja excluir seus arquivos é usar o pwdcomando que exibirá seu diretório atual e, em seguida, lsverificar se você encontra os arquivos que está esperando.

Se você estiver um pouco apreensivo sobre a emissão do rmcomando, há duas coisas que você pode fazer:

  1. digite ls *.xvgpara ver uma lista de quais arquivos seriam afetados por este comando.

  2. A menos que você tenha muitos arquivos, sempre poderá usar a -iopção de linha de comando para rm(também existe para cpe mv). O uso rm -i *.xvgsolicitaria que cada arquivo individual fosse aceitável para excluí-lo, para que você pudesse ter certeza de que nada que não esperava fosse excluído. (Isso será tedioso se você tiver muitos arquivos :)

Levon
fonte
11
Também: rm -f {*.xvg,.*.xvg}para remover também arquivos ocultos. E rm -R -f {*.xvg,.*.xvg}para remover também diretórios.
Dor
20

Você não precisa navegar para o diretório, basta usar

rm /some/dir/*.xvg 

No caso de um erro de digitação ou erro semelhante no caminho, onde / som / dir não existe:

cd /som/dir
rm *.xvg

excluirá acidentalmente todos os arquivos .xvg no diretório atual. O primeiro comando não será, e você não precisa fazer o cd novamente.

Uma maneira alternativa seria usar o find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 
Usuário desconhecido
fonte
find / some / dir / -maxdepth 1 -type f -name "* .xvg" -delete funcionou para mim! usar -maxdepth "n" para arquivos correspondentes de exclusão no diretório sub se determinado caminho
Vinay
3

Sim, rm *.xvg somente os arquivos que terminam com .xvgno diretório atual serão excluídos . Aqui está o porquê.

Quando você digita um comando como este, o trabalho é dividido entre o shell que você está usando (vamos assumir o bash) e o comando binário.

Você pode localizar o binário digitando which rm. Este pequeno programa cuida de desvincular arquivos. Programas como esse podem ser iniciados na linha de comando e podem ler uma lista de argumentos prog arg1 arg2 arg3quando iniciados. No caso de rm, eles são interpretados como uma lista de nomes de arquivos totalmente qualificados a serem excluídos. Portanto, se você estiver em um diretório que contém o arquivo foo.bar, a digitação delete 'foo.*'resultará emrm: foo.*: No such file or directory . Observe as aspas simples ao redor do padrão do arquivo; elas dizem ao shell para passar o argumento para o shell como está.

No entanto, se você digitar rm *.barno mesmo diretório, ele excluirá o arquivo. O que está acontecendo aqui é que seu shell, que é o programa que você está usando para digitar comandos, está executando algumas transformações antes de passar os argumentos para o comando. Um deles é chamado de 'expansão de nome de arquivo', também conhecido como 'globbing'. Você pode ver uma lista de expansões de nome de arquivo bash aqui . Uma das expansões mais comuns é* , que é expandida para nomes de arquivos no diretório atual.

Uma maneira simples de observar os globs no trabalho é usar echo, que imprime todos os argumentos passados ​​a ele através do shell. Então, digitando echo *no mesmo diretório será exibido foo.bar. Portanto, quando você digita rm *.bar, o que realmente está acontecendo é que o shell expande a lista de argumentos para foo.bare passa isso para orm comando.

Existem algumas maneiras de controlar o globbing. Nas versões recentes do bash, por exemplo, você pode ativar uma opção chamada globstar, que fará a expansão recursiva. A digitação echo **/*.barmostrará uma lista de todos os arquivos que terminam .barem todas as subpastas. Portanto, digitar o rm **/*.barbasstar ativado pela globstar excluirá recursivamente todos os arquivos correspondentes nas subpastas.

purzelrakete
fonte
1

Comando:

  rm ./*.pgm

funciona para mim

Comando:

rm *.pgm

dá o comando error (em polonês, traduzido):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

em

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
Adão
fonte