Por que o código em um loop for executado apenas no primeiro diretório em um shell bash?

0

Em um diretório chamado a , há muitas subpastas onde quero fazer algo. O mesmo para todos. Eu faço o seguinte, mas se aplica apenas ao primeiro subdiretório:

for i in "a/*"
    do
            #echo $i
            cd $i
            mkdir test
            mv *_no test
            touch aaa
            cd ..
    done

O código acima eu quero ser executado em todos os diretórios em a .

    
por curious 19.10.2012 / 16:23

3 respostas

2

Ao usar glob s, você deve remover as aspas. Caso contrário, o glob s não será expandido.

Então:

for i in a/*
    
por 19.10.2012 / 16:24
4

O primeiro cd chdirs no primeiro diretório (dois níveis de subdiretórios). E depois disso você não pode cd no segundo porque você só retornou um nível para não voltar de onde começou. Mas, mesmo assim, você está circulando sobre um único valor: "a /*".

Como você colocou aspas em torno disso, ele não está sendo expandido.

No entanto, você esqueceu de colocar aspas em torno de $i , de modo que ele é expandido nesse ponto como argumentos para cd .

Existem muitos outros problemas com o seu código.

Algumas sugestões de melhorias:

for i in a/*/; do
  (
    cd -- "$i" &&
      mkdir -p test || exit
    mv -- *_no test
    touch aaa
  )
done
    
por 19.10.2012 / 16:44
0

As citações de $ i dentro do loop não fazem nada, pois a/*/ já está expandido em palavras. Por exemplo, se a/*/ for expandido para um / Meus documentos /, no primeiro loop $i = a/My e segundo loop $i = Documents/ Experimente

find . -maxdepth 1 -type d | while read i; do
  (
    cd -- "$i" &&
      mkdir -p test || exit
    mv -- *_no test
    touch aaa
  )
done
    
por 19.10.2012 / 21:44

Tags