Como configurar um loop em csh para definir variáveis para nomes de diretórios?

1

Minha estrutura de arquivos é assim.

unix% ls
NGC2201 IC0499 IC7216 NGC7169
unix% cd NGC2201
unix% ls
7019 2221 note

onde 7019 e 2221 são novos diretórios e note é um arquivo de texto que eu uso para criar variáveis. O conteúdo dentro de 2221 e 7019 é importante, mas não precisa ser definido como variáveis; meus scripts depois cuidarão de tudo isso.

Meu script atual é o seguinte:

# The purpose of this script is to take the note files provided and set the values as variables.

#!/bin/csh -f

set z='grep -E '^z=' note | cut -d= -f2'
set nh='grep 'NH' note | cut -d= -f2'
set xc='grep 'Center' note | cut -d, -f1 | cut '-d' -f4'


echo $z $nh $xc

Isso define três variáveis para uso no diretório atual (neste caso, usaremos NGC2201 como o diretório pai e 7019 e 2221 como subdiretórios para essas variáveis a serem usadas).

Minha pergunta é como escrever um script para definir automaticamente o NGC2201 como uma variável chamada $ g e 2221 como uma variável chamada $ obs.

Após o script ser executado através de 2221, eu gostaria que ele configurasse o diretório como 7019 e repetisse as etapas. Depois que os diretórios dentro do NGC2201 forem concluídos, eu gostaria que o script passasse para IC0499, repita o processo, etc.

Como obtenho o script para executar os diretórios? Eu não posso torná-lo global porque não pode ser muito intrusivo; Eu preciso que ele vá apenas até dois diretórios para ser satisfatório.

Eu gostaria de mantê-lo dentro de csh, se possível, mas se isso é mais fácil no tcsh ou bash, eu sou todo para isso. Além disso, se houver uma solução mais fácil do que fazer um loop desse jeito, eu também sou a favor disso.

    
por J. Doe 06.06.2018 / 08:05

1 resposta

4

Em csh , você pode usar um loop foreach para percorrer todos os subdiretórios dos diretórios no diretório atual:

foreach i (*/*/)
  set g='echo $i | cut -d/ -f1'   # slash-delimited, select first field
  set obs='echo $i | cut -d/ -f2' # slash-delimited, select second field
  echo $g $obs
end

O bash equivalente é um loop for . É claro que você pode usar cut como acima, mas bash também tem um recurso elaborado de Expansão de Parâmetro , então você não precisa chamar nada externo:

for i in */*/; do
  g=${i%%/*}   # cut everything from the first slash 
  obs=${i#*/}  # cut everything until first slash
  obs=${obs%/} # cut slash at the end
  echo $g $obs
done

Substitua a linha echo pelo que você quiser com as variáveis.

Exemplo de execução

% é o prompt csh , $ o bash um.

% tree    
.
├── IC0499
├── IC7216
│   └── 2222
├── NGC2201
│   ├── 2221
│   ├── 7019
│   └── note
└── NGC7169

7 directories, 1 file

% foreach i (*/*/)
? set g='echo $i | cut -d/ -f1'
? set obs='echo $i | cut -d/ -f2'
? echo $g $obs
? end
IC7216 2222
NGC2201 2221
NGC2201 7019

$ for i in */*/; do g=${i%%/*}; obs=${i#*/}; obs=${obs%/}; echo $g $obs; done
IC7216 2222
NGC2201 2221
NGC2201 7019

Citando o link :

Please note that csh was popular for many innovative features but csh has never been as popular for scripting. If you are writing system level rc scripts avoid using csh. You may want to use /bin/sh for any scripts that might have to run on other systems.

    
por dessert 06.06.2018 / 11:12