É muito menos digitação e mexer se você usa globalização recursiva. No bash, coloque shopt -s globstar
no seu .bashrc
. No ksh93, a globalização recursiva requer set -o globstar
; em zsh funciona fora da caixa. Esteja ciente de que, no bash, a globalização recursiva também recorre sob links simbólicos para diretórios.
Para salvar a manipulação de strings, primeiro mude para o topo da árvore de fontes (ou para o topo da árvore de destino).
cd foo
for x in **/*.foo; do foo "$x" >"../dest/${x%.*}.changed.foo"; done
Você pode omitir as aspas duplas se souber que seus nomes de arquivo não contêm caracteres em branco ou globbing.
No zsh, as aspas duplas nunca são necessárias, e você pode economizar um pouco mais de digitação mesmo sem alterar o diretório atual.
for x in src/**/*.foo; do foo $x >../dest/${${x#*/}%.*}.changed.foo; done
for x in src/**/*.foo; do foo $x >../dest/${x#*/}:r.changed.foo; done
for x (src/**/*.foo) foo $x >../dest/${x#*/}:r.changed.foo
Se você fizer isso com frequência, deverá definir uma regra de criação, por exemplo, em um arquivo GNUmake (use uma aba onde usei 8 espaços):
source_files = $(shell find src -name '*.foo')
destination_files = $(patsubst src/,dest/,$($(source_files)%.foo=.changed.foo))
default: all-foo
all-foo: $(destination_files)
dest/%.changed.foo: src/%.foo
foo $< >$@