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

32

Se eu definir o diretório atual / de trabalho (navegando para ele usando cd ) para um diretório específico e, em seguida, digite:

rm *.xvg

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

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

    
por Andrew 30.06.2012 / 23:33

3 respostas

33

Sim, rm *.xvg excluirá somente os arquivos com a extensão especificada em seu diretório atual .

Uma boa forma de certificar-se de que você está realmente no diretório que deseja excluir seus arquivos é usar o comando pwd , que exibirá seu diretório atual e fará um ls para verificar você encontra os arquivos que você está esperando.

Se você está um pouco apreensivo sobre a emissão do comando rm , existem duas coisas que você pode fazer:

  1. digite ls *.xvg para ver uma lista de quais arquivos seriam afetados por esse comando.

  2. A menos que você tenha um lote de arquivos, sempre poderá usar a opção de linha de comando -i para rm (também existe para cp e mv ). Usar rm -i *.xvg solicitaria cada arquivo individual se não houvesse problema em excluí-lo, portanto, você pode ter certeza de que nada que não esperava fosse excluído. (Isso será entediante se você tiver muitos arquivos):

por 30.06.2012 / 23:41
19

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

rm /some/dir/*.xvg 

No caso de você ter 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 vai, e você não precisa voltar cd novamente.

Uma maneira alternativa seria usar o find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 
    
por 01.07.2012 / 13:54
3

Sim, rm *.xvg excluirá somente arquivos que terminem com .xvg no 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 arg3 quando eles são iniciados. No caso de rm , eles são interpretados como uma lista de nomes de arquivos completos a serem excluídos. Portanto, se você estiver em um diretório que contenha o arquivo foo.bar , digitar delete 'foo.*' resultará em rm: foo.*: No such file or directory . Observe as aspas simples ao redor do padrão de arquivo, elas dizem ao shell para passar o argumento para o shell como ele é.

No entanto, se você digitar rm *.bar no mesmo diretório, ele excluirá o arquivo. 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 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 para ele através do shell. Portanto, digitar echo * no mesmo diretório gerará foo.bar . Portanto, quando você digita rm *.bar , o que realmente está acontecendo é que o shell expande a lista de argumentos para foo.bar e passa para o comando rm .

Existem algumas maneiras de controlar o globbing. Em versões recentes do bash, por exemplo, você pode ativar uma opção chamada globstar que fará a expansão recursiva. Digitar echo **/*.bar mostrará uma lista de todos os arquivos que terminam em .bar em todas as subpastas. Portanto, digitar rm **/*.bar no globstar enabled bash excluirá de forma recursiva todos os arquivos correspondentes nas subpastas.

    
por 01.07.2012 / 13:11