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

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

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

rm *.xvg

O que esse comando fará? É verdade que o comando acima iráapenasexclua arquivos com a extensão.xvg apenasno diretório de trabalho?

Fiquei nervoso em tentar fazer isso antes de perguntar, porque quero ter certeza absoluta de que o comando acima excluirá apenas .xvgarquivosLOCALIZADO NO DIRETÓRIO DE TRABALHO.

Responder1

Sim, rm *.xvgvaiapenasexclua os arquivos com a extensão especificada em seuatualdiretório.

AbomUma maneira de ter certeza de que você está realmente no diretório onde deseja excluir seus arquivos é usar o pwdcomando que exibirá seu diretório atual e, em seguida, fazer um lspara verificar se você encontrou os arquivos que está esperando.

Se você estiver um pouco apreensivo ao emitir o 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 ummuitode arquivos, você também pode usar a -iopção de linha de comando para rm(também existe para cpe mv). O uso rm -i *.xvgsolicitaria cada arquivo individual se não houvesse problema em excluí-lo, para que você pudesse ter certeza de que nada que não esperava estava sendo excluído. (Isso será entediante se você tiver muitos arquivos :)

Responder2

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

rm /some/dir/*.xvg 

Caso você tenha 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 funcionará e você não precisará fazer o cd novamente.

Uma maneira alternativa seria usar find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 

Responder3

Sim, rm *.xvgexcluirá apenas arquivos que terminam .xvgem seu diretório atual. 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 este podem ser iniciados a partir da linha de comando e podem ler uma lista de argumentos prog arg1 arg2 arg3quando são inicializados. 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, digitar delete 'foo.*'resultará em rm: foo.*: No such file or directory. Observe as aspas simples em torno do padrão de arquivo, elas dizem ao shell para passar o argumento para o shell como está.

No entanto, se você digitar rm *.barno mesmo diretório, o arquivo será excluído. O que está acontecendo aqui é que o seu shell, que é o programa que você está usando para digitar comandos, está realizando 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 nomes de arquivos bashaqui. Uma das expansões mais comuns é *, que é expandida para nomes de arquivos no diretório atual.

Uma maneira simples de ver os globs em funcionamento é usar echo, que imprime todos os argumentos passados ​​a ele por meio do shell. Portanto, digitar echo *no mesmo diretório resultará em foo.bar. Então, quando você digita rm *.bar, o que realmente acontece é que o shell expande a lista de argumentos para foo.bare depois passa isso para o rmcomando.

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á expansão recursiva. A digitação echo **/*.barmostrará uma lista de todos os arquivos que terminam em .bartodas as subpastas. Portanto, digitar rm **/*.barbash habilitado para globstar excluirá recursivamente todos os arquivos correspondentes nas subpastas.

Responder4

Comando:

  rm ./*.pgm

funciona para mim

Comando:

rm *.pgm

dá comando de erro (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)

informação relacionada