При использовании рекурсивного подстановки гораздо меньше набора текста и возни. . В bash поместите shopt -s globstar
в свой .bashrc
. В ksh93 для рекурсивного подстановки требуется установить -o globstar
; в zsh работает из коробки. Помните, что в bash рекурсивная подстановка также рекурсивна по символическим ссылкам на каталоги.
Чтобы сэкономить на манипуляциях со строками, сначала перейдите в верхнюю часть исходного дерева (или в верхнюю часть целевого дерева).
cd foo
for x in **/*.foo; do foo "$x" >"../dest/${x%.*}.changed.foo"; done
Вы можете опустить двойные кавычки, если знаете, что имена ваших файлов не содержат пробелов или символов подстановки.
В zsh двойные кавычки никогда не нужны, и вы можете сэкономить на вводе текста даже без изменения текущего каталога.
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
Если вы делаете это часто, вам следует определить правило сборки, например в файле GNUmakefile (используйте вкладку, где я использовал 8 пробелов):
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 $< >$@