Isso pode ser tratado com a remoção de prefixo:
for d in data/*
do
mkdir "./results/${d#*/}"
myprogram "$d/raw_data" > "../results/${d#*/}/output"
done
A construção ${d#*/}
é chamada remoção de prefixo . Ele remove tudo até o primeiro /
na string $d
. Como exemplo:
$ d=data/subdir1
$ echo "${d#*/}"
subdir1
Notas
-
A menos que você deseje a divisão de palavras e a expansão do nome do caminho, todas as variáveis do shell devem estar entre aspas duplas.
-
ls
foi projetado para produzir uma saída amigável para o usuário. Como um exemplo, um nome de arquivo mostrado porls
deve ser exibido corretamente e não corresponde necessariamente ao nome real do arquivo. O uso dels
em scripts deve ser evitado. -
Uma alternativa à remoção do prefixo como mostrado acima é o executável
dirname
.
Documentação
De man bash
:
${parameter#word}
${parameter##word}Remove matching prefix pattern. The word is expanded to produce a pattern just as in pathname expansion. If the pattern matches the beginning of the value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the
#
case) or the longest matching pattern (the##
case) deleted. If parameter is @ or *, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with @ or *, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.