rm -rf não funciona com dígitos usando o linux?

0

Este é o meu diretório atual que contém as seguintes pastas:

rpea-vd1-430: ls
rev10  rev11  rev12  rev2  rev3  rev4  rev5  rev6  rev7  rev8  rev9  Synthesis.config  Synthesis.html

Eu usei o seguinte comando linux para remover as pastas.

 rm -rf rev[1-11]

mas meu comando falha se eu der

rm -rf rev[1-9] 

porque remove os diretórios que são nomeados de rev1 a rev9; por que não está considerando dois dígitos?

Resultado esperado:

rev11  Synthesis.config  Synthesis.html
    
por salma 05.07.2017 / 09:09

3 respostas

1

why is rm -rf rev[1-9] not considering double digits?

Por que deveria? Você especificou apenas um dígito. A expressão de colchete [..] corresponde exatamente a um caractere, que deve ser um dos listados dentro dos colchetes. Portanto, rev[1-9] corresponde a nomes de arquivos do formato revN , em que N é algum dígito (exceto 0 ). Da mesma forma, rev[1-11] corresponde exatamente a rev1 , pois 1 é o único caractere especificado entre colchetes, embora seja especificado várias vezes. É o mesmo que rev[1] ou rev1 . Da mesma forma, rev[1-12] seria o mesmo que rev[12] .

Você pode usar rev[0-9]* para corresponder a todos os nomes de arquivos que começam com rev , um dígito e, em seguida, qualquer coisa, ou usando globos estendidos no Bash e no ksh, rev+([0-9]) . A subexpressão +(...) corresponde a pelo menos uma repetição do padrão entre parênteses, da mesma forma que (...)+ em expressões regulares.

Por outro lado,

Expansão de contraventamento{a..b} geraria cadeias de caracteres, não corresponderá a nomes de ficheiros, pelo que poderá utilizar rev{1..12} para gerar rev1 , rev2 , ... rev12 . Isso não leva em conta se os arquivos existem, portanto também geraria rev1 , o que não existe no seu exemplo.

A julgar pela edição, você deseja corresponder (e rm ) todos os arquivos correspondentes a rev* , exceto rev11 ? A maneira mais fácil é provavelmente renomear a exceção temporariamente (assumindo que arev11 não existe):

$ mv rev11 arev11
$ rm -r rev*
$ mv arev11 rev11

Você pode usar a expansão de chaves ...

$ rm -r rev{{1..10},12}

(Isso dará erros sobre nomes inexistentes se você definir o limite superior muito alto.)

Criar um glob que combine com números diferentes de 11 é um pouco mais complicado, possivelmente algo assim, mas é melhor verificar primeiro:

$ echo rm -r rev[0-9] rev1[02-9] rev[2-9][0-9]
    
por 05.07.2017 / 10:50
2

A expansão de contraventamento não é numérica.

  • rev[1-9] expandirá [1-9] com todos os caracteres entre 1 e 9
  • rev[2468] será expandido para rev2 rev4 rev6 rev8
  • rev[A-Z] expandirá para revA revB ... revZ (desde que o arquivo exista)
  • rev[1-11] também será expandido para todos os caracteres entre 1 e 1
  • rev[1-15] será expandido para todos os caracteres entre 1 e 1 e o char 5 será equivalente a rev[15] , correspondendo rev1 e rev5
por 05.07.2017 / 10:45
0

Você precisa usar as chaves e .. :

rm -rf rev{1..11}

Veja a diferença entre echo rev[1-11] e echo rev{1..11} .

    
por 05.07.2017 / 09:12

Tags